<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title><![CDATA[Knock Changelog]]></title>
        <description><![CDATA[Latest updates and improvements from Knock.]]></description>
        <link>https://knock.app/changelog</link>
        <generator>RSS for Node and Next.js</generator>
        <lastBuildDate>Fri, 15 May 2026 23:31:58 GMT</lastBuildDate>
        <atom:link href="https://knock.app/changelog.xml" rel="self" type="application/rss+xml"/>
        <pubDate>Fri, 15 May 2026 23:31:58 GMT</pubDate>
        <copyright><![CDATA[Copyright 2026, Knock]]></copyright>
        <language><![CDATA[en]]></language>
        <managingEditor><![CDATA[support@knock.app (Knock)]]></managingEditor>
        <webMaster><![CDATA[support@knock.app (Knock)]]></webMaster>
        <ttl>60</ttl>
        <item>
            <title><![CDATA[Reusable request input schemas]]></title>
            <description><![CDATA[Define the data each reusable step expects so you can map workflow payloads with less guesswork.]]></description>
            <link>https://knock.app/changelog#2026-05-14</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-05-14</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 14 May 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're launching input schemas for reusable requests. Engineering teams can now define the exact data a <a href="https://docs.knock.app/designing-workflows/fetch-function#reusable-fetch-functions">reusable request</a> expects, including required fields and input structure.</p>
<p>Before this release, reusable requests provided a template, but teams still needed to know which variable names were expected and which fields were required. With input schemas, teams that add a reusable step to a workflow can see the required payload and map the right workflow data into it.</p>
<h2 id="define-reusable-request-inputs">Define reusable request inputs</h2>
<p>For example, a reusable request like "Get latest articles" may need data like this:</p>
<figure data-rehype-pretty-code-figure=""><pre style="background-color:#ffffff;color:#24292eff" tabindex="0" data-language="json" data-theme="min-light"><code data-language="json" data-theme="min-light" style="display: grid;"><span data-line=""><span style="color:#24292EFF">{</span></span>
<span data-line=""><span style="color:#D32F2F">  "number_of_articles"</span><span style="color:#212121">:</span><span style="color:#1976D2"> 3</span><span style="color:#212121">,</span></span>
<span data-line=""><span style="color:#D32F2F">  "category"</span><span style="color:#212121">:</span><span style="color:#22863A"> "product updates"</span><span style="color:#212121">,</span></span>
<span data-line=""><span style="color:#D32F2F">  "user_id"</span><span style="color:#212121">:</span><span style="color:#22863A"> "user_123"</span></span>
<span data-line=""><span style="color:#24292EFF">}</span></span></code></pre></figure>
<p>With input schemas, engineering teams can define that required structure once:</p>
<figure data-rehype-pretty-code-figure=""><pre style="background-color:#ffffff;color:#24292eff" tabindex="0" data-language="json" data-theme="min-light"><code data-language="json" data-theme="min-light" style="display: grid;"><span data-line=""><span style="color:#24292EFF">{</span></span>
<span data-line=""><span style="color:#D32F2F">  "properties"</span><span style="color:#212121">:</span><span style="color:#24292EFF"> {</span></span>
<span data-line=""><span style="color:#D32F2F">    "number_of_articles"</span><span style="color:#212121">:</span><span style="color:#24292EFF"> { </span><span style="color:#D32F2F">"type"</span><span style="color:#212121">:</span><span style="color:#22863A"> "number"</span><span style="color:#24292EFF"> }</span><span style="color:#212121">,</span></span>
<span data-line=""><span style="color:#D32F2F">    "category"</span><span style="color:#212121">:</span><span style="color:#24292EFF"> { </span><span style="color:#D32F2F">"type"</span><span style="color:#212121">:</span><span style="color:#22863A"> "string"</span><span style="color:#24292EFF"> }</span><span style="color:#212121">,</span></span>
<span data-line=""><span style="color:#D32F2F">    "user_id"</span><span style="color:#212121">:</span><span style="color:#24292EFF"> { </span><span style="color:#D32F2F">"type"</span><span style="color:#212121">:</span><span style="color:#22863A"> "string"</span><span style="color:#24292EFF"> }</span></span>
<span data-line=""><span style="color:#24292EFF">  }</span></span>
<span data-line=""><span style="color:#24292EFF">}</span></span></code></pre></figure>
<p>When someone adds that reusable request into a workflow, Knock shows them exactly what data to pass through.</p>
<p>This makes reusable steps more flexible and helps teams standardize workflow logic without rebuilding the same request again and again.</p>
<h2 id="map-workflow-data-with-less-guesswork">Map workflow data with less guesswork</h2>
<p>To start using input schemas, open a reusable request and define the inputs it should expect. Add each field, choose its type, and mark any required fields so other teams know what data the request needs before they use it in a workflow.</p>
<p>&#x3C;ImageModal
src="/assets/changelog/reusable-request-input-schemas/fetch-inputs-1.png"
alt="Defining inputs for a reusable request"</p>
<blockquote>
</blockquote>
<p><img
 src="/assets/changelog/reusable-request-input-schemas/fetch-inputs-1.png"
 alt="Defining inputs for a reusable request"
 className="w-full h-auto rounded-md mx-auto border border-gray-200"
/>
</ImageModal></p>
<p>Those mapped inputs are available as parameters in the reusable request template. Reference them in the request URL, headers, or body to keep the request configuration reusable while each workflow passes in its own values.</p>
<p>&#x3C;ImageModal
src="/assets/changelog/reusable-request-input-schemas/fetch-inputs-4.webp"
alt="Using values in the request template"</p>
<blockquote>
</blockquote>
<p><img
 src="/assets/changelog/reusable-request-input-schemas/fetch-inputs-4.webp"
 alt="Using values in the request template"
 className="w-full h-auto rounded-md mx-auto border border-gray-200"
/>
</ImageModal></p>
<p>Once the schema is defined, add the reusable request to a workflow. Knock shows the required inputs in the fetch step, so the person building the workflow can see what data they need to provide.</p>
<p>&#x3C;ImageModal
src="/assets/changelog/reusable-request-input-schemas/fetch-inputs-2.webp"
alt="Add reusable request to a workflow fetch step"</p>
<blockquote>
</blockquote>
<p><img
 src="/assets/changelog/reusable-request-input-schemas/fetch-inputs-2.webp"
 alt="Add reusable request to a workflow fetch step"
 className="w-full h-auto rounded-md mx-auto border border-gray-200"
/>
</ImageModal></p>
<h2 id="get-started">Get started</h2>
<p>Input schemas for reusable requests are available today for all Knock customers. Learn more in <a href="https://docs.knock.app/designing-workflows/fetch-function">our documentation</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dynamic audiences]]></title>
            <description><![CDATA[Dynamic audiences in Knock are versioned, previewable, and promotable between environments—and you can build them from the dashboard, the CLI, or an agent.]]></description>
            <link>https://knock.app/changelog#2026-04-30</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-04-30</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 30 Apr 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we’re excited to announce the general availability of dynamic audiences.</p>
<p>For the past few months, we've seen beta customers build dynamic audiences and use them to trigger workflows, target broadcasts and guides, and create exclusion lists, all without needing to wrangle data themselves.</p>
<p>While dynamic audiences are a familiar concept across customer engagement solutions, we built Knock's version to go further than most. Here's how.</p>
<h2 id="create-real-time-user-segments">Create real-time user segments</h2>
<p>Dynamic audiences allow you to query user properties to create segments of users that update in real time.</p>
<p>Reference properties like <code>plan_tier</code> to build a list of paying users, <code>signup_date</code> to check the number of signups over the last 90 days, or <code>last_active_timestamp</code> to build a target audience for a re-engagement campaign.</p>
<p>&#x3C;ImageModal
src="/assets/changelog/introducing-dynamic-audiences/free-plan-audience-details.png"
alt="Using audience membership to trigger guides, broadcasts, and workflows"</p>
<blockquote>
</blockquote>
<p><img
 src="/assets/changelog/introducing-dynamic-audiences/free-plan-audience-details.png"
 alt="Using audience membership to trigger guides, broadcasts, and workflows"
 className="w-full h-auto rounded-md mx-auto border border-gray-200"
/>
</ImageModal></p>
<p>As your data changes, users will enter or exit dynamic audiences based on their eligibility. Each entrance or exit is recorded as a membership event, which you can use to trigger workflows. No cron job, webhook, or hand-rolled event handler required.</p>
<p>You can use membership status to trigger guides, target broadcasts, or as part of true-false conditions.</p>
<p>&#x3C;ImageModal
src="/assets/blog/introducing-data-functions/audience-membership-guide-trigger.png"
alt="Using audience membership to trigger guides, broadcasts, and workflows"</p>
<blockquote>
</blockquote>
<p><img
 src="/assets/blog/introducing-data-functions/audience-membership-guide-trigger.png"
 alt="Using audience membership to trigger guides, broadcasts, and workflows"
 className="w-full h-auto rounded-md mx-auto"
/>
</ImageModal></p>
<h2 id="audiences-with-version-control">Audiences with version control</h2>
<p>Most customer engagement platforms have some version of dynamic audiences, but they don't have a way to verify or preview audience changes before you make updates.</p>
<p>When you have a highly-automated messaging system, this can cause large-scale mistakes that are hard to fix retroactively.</p>
<p>With Knock dynamic audiences, we planned for this.</p>
<p>Dynamic audiences are versioned and promoted between environments, the same way you'd promote any other Knock resource. You draft a change in development, preview it against live user data, and promote it to production only when you're sure it does what you think it does. Membership is evaluated in real time once changes are promoted, not before.</p>
<p>&#x3C;ImageModal
src="/assets/changelog/introducing-dynamic-audiences/commit-audience-changes.png"
alt="Building a dynamic audience with a live member preview"</p>
<blockquote>
</blockquote>
<p><img
 src="/assets/changelog/introducing-dynamic-audiences/commit-audience-changes.png"
 alt="Building a dynamic audience with a live member preview"
 className="w-full h-auto rounded-md mx-auto border border-gray-200"
/>
</ImageModal></p>
<p>This matters because small changes to an audience that triggers actual workflows can have real consequences. Editing a simple condition (i.e. flipping an operator or adjusting a threshold) can mistakenly push thousands of users into a sequence you didn't mean to run.</p>
<p>Versioning makes it easy to test changes and reduce mistakes. No more audience targeting held together with tape and glue.</p>
<h2 id="build-audiences-with-ai">Build audiences with AI</h2>
<p>Instead of building lists manually, you can now describe the audience you want and let AI generate the conditions for you.</p>
<p><strong>From the dashboard.</strong> While building a dynamic audience, use the "Generate" button turn a natural-language prompt into audience filters. This is useful for when you know the audience you want but don't want to search for and build each condition from scratch.</p>
<p><video controls muted><source src="/assets/changelog/introducing-dynamic-audiences/dynamic-audiences-conditions.mp4" type="video/mp4" /></video></p>
<p><strong>With Knock agent.</strong> Use the Knock agent in the dashboard to create or refine an audience with a prompt. Turn an idea like "active free users who signed up this quarter" into a reviewable dynamic audience using the data available in Knock.</p>
<p><video controls muted><source src="/assets/changelog/introducing-dynamic-audiences/dynamic-audiences-agent.mp4" type="video/mp4" /></video></p>
<p><strong>From your AI editor.</strong> Point your favorite coding agent at the <a href="https://docs.knock.app/ai/mcp-server">Knock MCP server</a> to create, edit, and update audiences from your IDE, then use the <a href="https://docs.knock.app/cli">Knock CLI</a> to pull, review, and promote those changes across environments. Good for bulk edits, refactors, and the kind of tedious segmentation work you'd otherwise put off.</p>
<p>&#x3C;ImageModal
src="/assets/changelog/introducing-dynamic-audiences/dynamic-audiences-code-editor.png"
alt="Promoting an audience version from development to production"</p>
<blockquote>
</blockquote>
<p><img
 src="/assets/changelog/introducing-dynamic-audiences/dynamic-audiences-code-editor.png"
 alt="Promoting an audience version from development to production"
 className="w-full h-auto rounded-md mx-auto border border-gray-200"
/>
</ImageModal></p>
<p>All three approaches produce the same versioned resource. Start with a prompt, review the generated audience, and promote it when you're sure it targets the right users.</p>
<h2 id="get-started">Get started</h2>
<p>Dynamic audiences officially bring user segmentation to Knock. Everything works the way you'd expect, with real-time evaluation, membership events, environment promotion, full API coverage, and first-class integration with workflows.</p>
<p>Dynamic audiences is available for all customers today. Open <strong>Audiences</strong> in the Knock dashboard and click "Create audience" to try it out. Learn more in our <a href="https://docs.knock.app/concepts/audiences">documentation</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Agent skills]]></title>
            <description><![CDATA[Package repeatable tasks into reusable commands you can run from anywhere in the Knock agent.]]></description>
            <link>https://knock.app/changelog#2026-04-23</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-04-23</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 23 Apr 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're releasing skills for the <a href="https://docs.knock.app/ai/agent">Knock agent</a>. Skills let you package a set of repeatable tasks into a single command you can run from anywhere in the Knock dashboard, so the work you do over and over gets done in one step.</p>
<p>If you're a lifecycle marketer drafting emails, you probably run through the same checklist every time: proofread the copy, verify links aren't broken, and confirm you're following deliverability best practices like alt text on images. Skills let you wrap that checklist into a command like <code>/review-email</code> and run it on demand.</p>
<h2 id="how-skills-work">How skills work</h2>
<p>A skill is a named set of instructions you define once and reuse across your team. When you invoke a skill in the Knock agent, it runs through the steps you defined, asks for input when it needs something from you, and applies changes in place.</p>
<p>Skills can be used for things like:</p>
<ul>
<li>Reviewing copy for typos and style guide compliance.</li>
<li>Checking that links in your emails resolve and aren't broken.</li>
<li>Auditing emails for deliverability best practices, like alt text on images.</li>
<li>Any other repeatable workflow you run across your messaging.</li>
</ul>
<p>&#x3C;ImageModal
src="/assets/changelog/agent-skills/create-skill.png"
alt="Creating a new skill in the Knock agent"</p>
<blockquote>
</blockquote>
<p><img
 src="/assets/changelog/agent-skills/create-skill.png"
 alt="Creating a new skill in the Knock agent"
 className="rounded-md mx-auto border border-gray-200"
/>
</ImageModal></p>
<h2 id="running-a-skill">Running a skill</h2>
<p>Once you've created a skill, you can run it by typing <code>/</code> in the Knock agent and selecting it from the menu. The agent takes it from there, working through each task in your skill and pausing to ask for your input when it needs a decision, like how to fix a broken link.</p>
<p><video controls muted><source src="/assets/changelog/agent-skills/review-skill-demo.mp4" type="video/mp4" /></video></p>
<p>When the agent finishes, you get a summary of what changed and what still needs your attention.</p>
<h2 id="get-started">Get started</h2>
<p>Skills are available today for all Knock customers. Head to the Knock agent in your dashboard to create your first skill, or read more <a href="https://docs.knock.app/ai/skills">in our documentation</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Layouts 2.0]]></title>
            <description><![CDATA[A refreshed email layouts experience with a unified three-pane UI, clearer usage across workflows and broadcasts, a more prominent layout selector in the template editor, and dark mode support.]]></description>
            <link>https://knock.app/changelog#2026-04-21</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-04-21</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 21 Apr 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're shipping a refreshed <a href="https://docs.knock.app/integrations/email/layouts">email layouts</a> experience, rebuilt for consistency and greater control while you work with templates in Knock.</p>
<h2 id="improved-layout-management">Improved layout management</h2>
<p>Layout management now has a consistent, three-pane experience, making layouts, workflows, and templates feel like one cohesive system.</p>
<p>Each layout page now has a "Used in" tab to see which workflows and broadcasts are using it. This makes it much easier to understand the impact of a change before you make it, which is especially useful for layouts used across many templates.</p>
<p>&#x3C;ImageModal
src="/assets/blog/layouts-2-0/layouts-used-in-closeup.png"
alt="Close-up of the 'Used in' data on the layouts page"</p>
<blockquote>
</blockquote>
<p><img
 src="/assets/blog/layouts-2-0/layouts-used-in-closeup.png"
 alt="Close-up of the 'Used in' data on the layouts page"
 className="w-full h-auto rounded-md mx-auto border border-gray-200"
/>
</ImageModal></p>
<h2 id="more-layout-controls-while-editing">More layout controls while editing</h2>
<p>When editing emails, we've made the layout selector more prominent, so assigning or swapping a layout no longer requires digging through settings.</p>
<p>&#x3C;ImageModal
src="/assets/blog/layouts-2-0/layouts-editor-closeup.png"
alt="Close-up of the layout selector in the email template editor"</p>
<blockquote>
</blockquote>
<p><img
 src="/assets/blog/layouts-2-0/layouts-editor-closeup.png"
 alt="Close-up of the layout selector in the email template editor"
 className="w-full h-auto rounded-md mx-auto border border-gray-200"
/>
</ImageModal></p>
<p>Additionally, you can now apply branding overrides at the layout level, giving teams that manage multiple brands or tenants more flexibility, without duplicating templates.</p>
<h2 id="dark-mode-support">Dark mode support</h2>
<p>Knock's email layouts now support dark mode out of the box. You can now upload dark mode assets and set dark mode branding variables that we'll automatically be rendered for users that use dark mode in their email client.</p>
<p>&#x3C;ImageModal
src="/assets/blog/layouts-2-0/layouts-dark-mode.png"
alt="Editing a layout's dark mode assets"</p>
<blockquote>
</blockquote>
<p><img
 src="/assets/blog/layouts-2-0/layouts-dark-mode.png"
 alt="Editing a layout's dark mode assets"
 className="w-full h-auto rounded-md mx-auto border border-gray-200"
/>
</ImageModal></p>
<h2 id="get-started">Get started</h2>
<p>The new layouts experience is available for all customers today. Learn more <a href="https://docs.knock.app/integrations/email/layouts">in our documentation</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Guides toolbar]]></title>
            <description><![CDATA[Preview and troubleshoot in-app guides inside your real product so you can ship messaging with confidence, settle "why isn't this showing?" faster, and keep testing from cluttering production engagement data.]]></description>
            <link>https://knock.app/changelog#2026-04-14</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-04-14</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 14 Apr 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we are introducing the guides toolbar, a floating debug panel you can open in your application to gain real-time visibility into your guides.</p>
<h2 id="what-it-solves">What it solves</h2>
<p>Building in-app messages shouldn't require guessing why they do or don't appear for a given user.</p>
<p>The toolbar closes the gap between configuring an in-app message and confirming it works. Whether you're launching a new onboarding tour, a feature announcement, or a contextual nudge, you can validate the full experience before it reaches a single end user.</p>
<h2 id="how-it-works">How it works</h2>
<p>The guides toolbar allows you to:</p>
<ul>
<li><strong>See what your users see.</strong> Toggle between all guides, active guides, and eligible guides to understand how your targeting rules play out in context. No more guessing whether a guide fired or why it didn't.</li>
<li><strong>Test in your real product environment.</strong> Force any guide to display on the current page so you can preview it exactly as your users will experience it within your actual UI, not a simulation.</li>
<li><strong>Inspect targeting in real time.</strong> View the parameters being evaluated for the current user and page so you can diagnose issues and fine-tune your audience rules with confidence.</li>
</ul>
<h2 id="testing-best-practices">Testing best practices</h2>
<p>Before launching your guides to users, always test them thoroughly to ensure they work as expected. Focus on these key areas:</p>
<ul>
<li><strong>Page targeting.</strong> Verify your guides appear on the correct pages by testing different URLs and path patterns in your activation rules.</li>
<li><strong>User targeting.</strong> Confirm your targeting conditions work correctly by testing with users who should and shouldn't see the guide based on your eligibility criteria.</li>
<li><strong>Engagement tracking events.</strong> Interact with your guides and verify that engagement status updates appear as expected in the dashboard (seen, interacted, archived).</li>
<li><strong>User interactions.</strong> Click all links, buttons, and interactive elements to ensure they work as expected and navigate to the correct destinations.</li>
</ul>
<h2 id="getting-started">Getting started</h2>
<p>The guides toolbar is available today for all Knock customers. For more information, read the <a href="https://docs.knock.app/in-app-ui/guides/debugging-guides">documentation</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Data sources]]></title>
            <description><![CDATA[Connect events from any service to your Knock messaging infrastructure in a few clicks, no code required.]]></description>
            <link>https://knock.app/changelog#2026-04-09</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-04-09</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 09 Apr 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're releasing data sources. With Knock data sources, you can connect events from any tool to your messaging infrastructure in a few clicks, no code required.</p>
<p>When events occur in your other services—like a new user in Clerk, a payment in Stripe, or a directory sync event in WorkOS—you can send that event data to Knock to create users, trigger workflows, and update audiences. Knock ingests, verifies, and transforms the event data for you to take action on.</p>
<h2 id="pre-built-sources">Pre-built sources</h2>
<p>We're shipping five pre-configured data sources: <a href="https://docs.knock.app/integrations/sources/stripe">Stripe</a>, <a href="https://docs.knock.app/integrations/sources/supabase">Supabase</a>, <a href="https://docs.knock.app/integrations/sources/posthog">PostHog</a>, <a href="https://docs.knock.app/integrations/sources/clerk">Clerk</a>, and <a href="https://docs.knock.app/integrations/sources/workos">WorkOS</a>. For each, we've handled verification schemes and created pre-configured action mappings so you can get set up with a few clicks.</p>
<p>&#x3C;ImageModal
src="/assets/blog/introducing-data-sources/pre-built-integrations.png"
alt="Pre-built data source integrations"</p>
<blockquote>
</blockquote>
<p><img
 src="/assets/blog/introducing-data-sources/pre-built-integrations.png"
 alt="Pre-built data source integrations"
 className="rounded-md mx-auto border border-gray-200"
/>
</ImageModal></p>
<h2 id="build-your-own-source">Build your own source</h2>
<p>For any other providers, use our custom data source to map any event to an action in Knock. Custom sources include a flexible JavaScript scripting framework to process, validate, and transform incoming requests.</p>
<p>&#x3C;ImageModal
src="/assets/blog/introducing-data-sources/adding-custom-source.png"
alt="Configuring a custom data source in Knock"</p>
<blockquote>
</blockquote>
<p><img
 src="/assets/blog/introducing-data-sources/adding-custom-source.png"
 alt="Configuring a custom data source in Knock"
 className="rounded-md mx-auto border border-gray-200"
/>
</ImageModal></p>
<p>This function runs whenever an event is received and before any actions are processed, enabling you to write your own logic to verify a payload and transform properties to better match how they're used in Knock messaging.</p>
<figure data-rehype-pretty-code-figure=""><pre style="background-color:#ffffff;color:#24292eff" tabindex="0" data-language="javascript" data-theme="min-light"><code data-language="javascript" data-theme="min-light" style="display: grid;"><span data-line=""><span style="color:#D32F2F">async</span><span style="color:#D32F2F"> function</span><span style="color:#6F42C1"> main</span><span style="color:#24292EFF">(ctx) {</span></span>
<span data-line=""><span style="color:#D32F2F">  const</span><span style="color:#24292EFF"> { </span><span style="color:#1976D2">headers</span><span style="color:#212121">,</span><span style="color:#1976D2"> rawBody</span><span style="color:#212121">,</span><span style="color:#1976D2"> body</span><span style="color:#212121">,</span><span style="color:#1976D2"> vars</span><span style="color:#24292EFF"> } </span><span style="color:#D32F2F">=</span><span style="color:#24292EFF"> ctx;</span></span>
<span data-line=""><span style="color:#D32F2F">  const</span><span style="color:#1976D2"> verified</span><span style="color:#D32F2F"> =</span><span style="color:#D32F2F"> await</span><span style="color:#6F42C1"> verifyHmacSha256</span><span style="color:#24292EFF">({</span></span>
<span data-line=""><span style="color:#24292EFF">    secret</span><span style="color:#D32F2F">:</span><span style="color:#24292EFF"> vars[</span><span style="color:#22863A">"SERVICE_SIGNING_SECRET"</span><span style="color:#24292EFF">]</span><span style="color:#212121">,</span></span>
<span data-line=""><span style="color:#24292EFF">    signature</span><span style="color:#D32F2F">:</span><span style="color:#24292EFF"> headers[</span><span style="color:#22863A">"x-webhook-signature"</span><span style="color:#24292EFF">]</span><span style="color:#212121">,</span></span>
<span data-line=""><span style="color:#24292EFF">    payload</span><span style="color:#D32F2F">:</span><span style="color:#24292EFF"> body</span><span style="color:#212121">,</span></span>
<span data-line=""><span style="color:#24292EFF">  });</span></span>
<span data-line=""><span style="color:#D32F2F">  const</span><span style="color:#1976D2"> full_name</span><span style="color:#D32F2F"> =</span><span style="color:#22863A"> `</span><span style="color:#D32F2F">${</span><span style="color:#1976D2">body</span><span style="color:#24292EFF">.first_name</span><span style="color:#D32F2F">}</span><span style="color:#D32F2F"> ${</span><span style="color:#1976D2">body</span><span style="color:#24292EFF">.last_name</span><span style="color:#D32F2F">}</span><span style="color:#22863A">`</span><span style="color:#24292EFF">;</span></span>
<span data-line=""><span style="color:#D32F2F">  return</span><span style="color:#24292EFF"> {</span></span>
<span data-line=""><span style="color:#24292EFF">    verified</span><span style="color:#212121">,</span></span>
<span data-line=""><span style="color:#24292EFF">    full_name</span><span style="color:#212121">,</span></span>
<span data-line=""><span style="color:#24292EFF">  };</span></span>
<span data-line=""><span style="color:#24292EFF">}</span></span></code></pre></figure>
<h2 id="get-started">Get started</h2>
<p>Data sources are available today for all Knock customers. Head to "Settings > Sources" in the dashboard, or read more <a href="https://docs.knock.app/integrations/sources/overview">in our documentation</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Trigger workflow function]]></title>
            <description><![CDATA[Invoke one workflow from another to reuse logic, compose notifications, and pass recipient-scoped data without duplicating steps.]]></description>
            <link>https://knock.app/changelog#2026-04-07</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-04-07</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 07 Apr 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're introducing the trigger workflow function, enabling you to trigger a different workflow from inside a workflow.</p>
<p>This function gives teams a way to build modular customer journeys and launch more sophisticated messaging campaigns. Instead of rebuilding the same logic in multiple places, you can create reusable workflow building blocks and trigger them whenever they are needed.</p>
<p>That means faster experimentation, easier maintenance, and more consistent customer experiences as your messaging strategy grows.</p>
<p>The trigger workflow step functions similarly to a standard workflow trigger, executing a specified workflow with a specified payload. The payload is constructed based on the configuration settings defined in the step.</p>
<p>The trigger workflow function is available today for all Knock customers. Learn more about it in <a href="https://docs.knock.app/designing-workflows/trigger-workflow-function">our documentation</a>.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Knock agent]]></title>
            <description><![CDATA[Build, edit, and ship messaging with AI from anywhere in the Knock dashboard.]]></description>
            <link>https://knock.app/changelog#2026-03-26</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-03-26</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 26 Mar 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're introducing the Knock agent, a new way to build, edit, and ship messaging with AI.</p>
<p>Built directly into the dashboard, the Knock agent has full context of your Knock account and assists with everything from answering questions to executing day-to-day tasks.</p>
<h2 id="how-it-works">How it works</h2>
<p>The agent is designed to work how you work. With every prompt, it references your existing setup to ensure outputs match your branding and writing style, make sense in the context of messaging, and leverage existing templates and components.</p>
<h3 id="create-and-manage-resources">Create and manage resources</h3>
<p>The Knock agent can be started from anywhere in the dashboard to create and manage any Knock resources, such as workflows, broadcasts, guides, and more.</p>
<p><video controls muted><source src="/assets/changelog/agent-create-workflow-new.mp4" type="video/mp4" /></video></p>
<h3 id="generate-beautiful-emails">Generate beautiful emails</h3>
<p>Gone are the days of building emails from scratch. Just describe what you want, upload a screenshot of an email you like, or send it a URL to pull content from. The agent builds a client-safe email using your layout and branding.</p>
<p><video controls muted><source src="/assets/changelog/agent-build-email-new.mp4" type="video/mp4" /></video></p>
<h3 id="build-audience-segments">Build audience segments</h3>
<p>You can also build user segments from scratch using the Knock agent. Describe the users you want to target, and the agent will pull together the right filters to create a dynamic audience, ready to use.</p>
<p><video controls muted><source src="/assets/changelog/agent-create-audience-new.mp4" type="video/mp4" /></video></p>
<h2 id="get-started">Get started</h2>
<p>The Knock agent is now available in public beta for all teams. Agent use is included on all Knock plans at no additional cost during the beta period as we refine the experience and expand capabilities.</p>
<p>Log in or sign up for Knock to give it a try. You can learn more in our <a href="https://docs.knock.app/ai/agent">documentation</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[MJML support]]></title>
            <description><![CDATA[Build responsive email layouts and templates in Knock using MJML, a framework that compiles to HTML optimized for email clients.]]></description>
            <link>https://knock.app/changelog#2026-03-19</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-03-19</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 19 Mar 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Knock now supports <a href="https://mjml.io/">MJML</a>, a responsive email framework that compiles to HTML optimized for email clients. MJML abstracts away the complexity of table-based layouts and media queries, so you can build component-based emails that look great across devices with less code.</p>
<p>You can use MJML for both email layouts and email templates:</p>
<ul>
<li><strong>Layouts</strong> work much like HTML layouts: they must include a root  tag, <code>{{ content }}</code> inserts the template body, and <code>{{ footer_links }}</code> inserts footer links when configured.</li>
<li><strong>Templates</strong> can be written fully in MJML or built in the visual editor, where blocks render as MJML components when the template or layout uses MJML. When using a layout, both the layout and template must be MJML.</li>
</ul>
<p>Knock also supports mixing in plain HTML by wrapping it in  automatically, so existing HTML snippets can still render correctly within MJML.</p>
<p>Learn more about MJML support in <a href="https://docs.knock.app/integrations/email/mjml">our documentation</a>.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Data functions]]></title>
            <description><![CDATA[New workflow functions for updating users, tenants, objects, and audiences directly from your workflows.]]></description>
            <link>https://knock.app/changelog#2026-03-10</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-03-10</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 10 Mar 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're introducing data functions, a new set of workflow steps that enable you to update your data in Knock from within a workflow.</p>
<p>The new data functions available include:</p>
<ul>
<li><strong>Update audience.</strong> Add or remove a user to or from a static audience. For example, when users hit a usage milestone, you can add them to a "Power users" audience, or remove them if they churn.</li>
<li><strong>Update user.</strong> Modify the recipient's properties or preferences. For example, you can mark the <code>completed_onboarding</code> user property as "true" when a user finishes the onboarding workflow.</li>
<li><strong>Update tenant.</strong> Modify a company's properties. For example, when a workspace upgrades their plan, you can update the tenant's <code>plan_tier</code> property to "Pro."</li>
<li><strong>Update object.</strong> Modify properties on any object in your environment (e.g. projects, orders, or tasks). For example, when a task is completed, you can update the project's <code>completed_tasks_count</code> so a summary notification shows the right total.</li>
<li><strong>Modify workflow.</strong> Add or update a property in your workflow's data scope. This allows you to compute a value in an early step (e.g. a personalized recommendation) and use it in later branch or message steps.</li>
</ul>
<p>Data functions help you turn real-time behavior into structured, reliable data from within a workflow. This ensures records stay enriched and up to date, powers better segmentation and personalization, and enables you to make users eligible to receive other messaging, including guides, broadcasts, or other workflows.</p>
<p>Data functions are available today for all Knock customers. <a href="https://docs.knock.app/designing-workflows/update-user-function">Read more</a> about designing workflows.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI agent function]]></title>
            <description><![CDATA[Run AI agents within your workflows to enrich data, personalize messaging, and bring context into your messaging flows.]]></description>
            <link>https://knock.app/changelog#2026-03-05</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-03-05</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 05 Mar 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're introducing the AI agent function for use in Knock workflows and broadcasts.</p>
<h2 id="user-content-how-it-works"><a href="#how-it-works" tabindex="-1"><span></span></a>How it works</h2>
<p>The AI agent function sends a prompt to an AI model of your choice and makes the response available in your workflow state. You can use it to enrich data, personalize messaging, and bring context into your messaging flows.</p>
<p>Common use cases include:</p>
<ul>
<li>Running research to enrich and store user and company data.</li>
<li>Personalizing messaging to drive higher conversion rates.</li>
<li>Summarizing batch content into concise digests.</li>
</ul>
<p>AI can help you generate a comprehensive prompt from scratch, or you can choose from one our prompt templates. You can structure your response format using a JSON schema, so your response comes back clean, typed, and ready to use downstream.</p>
<p>When the agent returns a response, it becomes available in workflow run data and can be referenced in subsequent steps and templates. This allows you to store data in Knock or use it to personalize your messaging.</p>
<h2 id="user-content-agent-pricing"><a href="#agent-pricing" tabindex="-1"><span></span></a>Agent pricing</h2>
<p>The AI agent function uses a credit model. Agent usage consumes credits according to your selected model and the number of tokens consumed by your agent.</p>
<p>All Knock plans come with an included amount of credits, after which you can pre-purchase top ups, configure auto-replenishment rules, and set max spend limits for your account.</p>
<h2 id="user-content-get-started"><a href="#get-started" tabindex="-1"><span></span></a>Get started</h2>
<p>The AI agent function is now available for all non-enterprise customers. Developer plans include 500 free credits per month and starter plans include 2,000.</p>
<p>If you are an enterprise customer and want access, please <a href="mailto:sales@knock.app?subject=Agent%20function%20access">get in touch</a>.</p>
<p>You can learn more in our <a href="https://docs.knock.app/designing-workflows/ai-agent-function">agent function docs</a>.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Remote MCP server]]></title>
            <description><![CDATA[Connect to the remote Knock MCP server with OAuth and take advantage of new debugging and workflow tools.]]></description>
            <link>https://knock.app/changelog#2026-02-26</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-02-26</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 26 Feb 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>The Knock MCP server is now available as a remote server at <code>mcp.knock.app/mcp</code> that you can connect to directly from any MCP client. There's no local installation or Node.js setup required.</p>
<p>To get started, add the server to your MCP client configuration:</p>
<pre><code class="language-json">{
  "mcpServers": {
    "knock": {
      "url": "https://mcp.knock.app/mcp"
    }
  }
}
</code></pre>
<p>When you first use a Knock tool, you'll be prompted to sign in with your Knock account. Full setup instructions are available for <a href="https://docs.knock.app/developer-tools/mcp-server#cursor">Cursor</a>, <a href="https://docs.knock.app/developer-tools/mcp-server#claude-desktop">Claude Desktop</a>, and <a href="https://docs.knock.app/developer-tools/mcp-server#claude-code">Claude Code</a>.</p>
<h2 id="user-content-oauth-authentication"><a href="#oauth-authentication" tabindex="-1"><span></span></a>OAuth authentication</h2>
<p>Previously, connecting to the Knock MCP server required a service token. Service tokens grant broad access to your Knock account and don't distinguish between individual users, which makes it difficult to audit who made changes and to enforce the principle of least privilege.</p>
<p>The MCP server now authenticates through your Knock account via OAuth. Your credentials are managed through the standard sign-in flow, and role-based permissions are automatically applied based on your user profile. This means each team member operates with the appropriate level of access without needing to share or rotate service tokens.</p>
<h2 id="user-content-new-and-updated-tools"><a href="#new-and-updated-tools" tabindex="-1"><span></span></a>New and updated tools</h2>
<p>We've also shipped a set of improvements to the tools available through the MCP server:</p>
<ul>
<li><strong>More granular workflow step tools.</strong> All workflow tools now accept <code>environment</code> and <code>channel_key</code> parameters, giving you explicit control over which environment and channel a step targets when creating or updating workflows.</li>
<li><strong>Message debugging.</strong> Added <code>get_message_delivery_logs</code> and <code>get_message_events</code> tools so you can inspect delivery attempts and the full event timeline for any message. We also fixed an issue with <code>get_user_messages</code>.</li>
<li><strong>Email layout tools.</strong> Added <code>list_email_layouts</code> and <code>get_email_layout</code> to enable you to discover and inspect email layouts when building email steps.</li>
</ul>
<p>See the full <a href="https://docs.knock.app/developer-tools/agent-toolkit/tools-reference">tools reference</a> for a complete list of available tools.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Workflow experiments]]></title>
            <description><![CDATA[Randomly route a percentage of recipients down different paths in your workflows for A/B tests, gradual rollouts, and more.]]></description>
            <link>https://knock.app/changelog#2026-02-24</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-02-24</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 24 Feb 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're introducing the experiment function in Knock to enable A/B testing, gradual rollouts, and more.</p>
<p>The experiment function enables you to split recipients into randomized cohorts within your workflows or broadcasts, routing each recipient down a specific branch based on a percentage-based distribution.</p>
<p>This is useful for:</p>
<ul>
<li><strong>A/B testing.</strong> Split recipients into two or more cohorts and compare the results of each. You can test different message formatting, copy, images, and more to measure what performs better.</li>
<li><strong>Gradual rollouts.</strong> Roll out a new notification strategy to a small percentage of recipients before expanding to all users.</li>
<li><strong>Channel experimentation.</strong> Test messaging through different channels in parallel to see which drive more engagement from your audience.</li>
</ul>
<h2 id="user-content-how-it-works"><a href="#how-it-works" tabindex="-1"><span></span></a>How it works</h2>
<p>When a workflow executes an experiment function, Knock randomly assigns the recipient to a cohort using the following process:</p>
<ul>
<li><strong>Configuring cohorts.</strong> Each experiment starts with two cohorts by default, split 50/50. You can adjust the percentage distribution to control the distribution of recipients or add additional cohorts. The total across all cohorts must equal 100%.</li>
<li><strong>Branch execution.</strong> Once assigned, the recipient proceeds through the steps defined in their cohort's branch.</li>
<li><strong>Observability.</strong> Like all Knock workflow functions, you get full visibility into execution through our debugging tools. You'll be able to see exactly which experiment cohort was chosen for each recipient.</li>
</ul>
<p>The experiment function also supports <strong>custom cohort keys</strong>. You can assign a cohort key to produce a deterministic assignment, such as ensuring all users within the same tenant follow the same branch. The cohort key defaults to the recipient ID.</p>
<p>Note: Dedicated experiment analytics are coming soon.</p>
<p>The experiment function is available now for all customers. <a href="https://docs.knock.app/designing-workflows/experiment-function">Read more</a> in the documentation.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Knock skills for AI coding agents]]></title>
            <description><![CDATA[A new open-source skills package that extends AI coding agents with Knock notification design and CLI expertise.]]></description>
            <link>https://knock.app/changelog#2026-02-19</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-02-19</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 19 Feb 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're releasing <a href="https://github.com/knocklabs/skills">Knock skills</a>, an open-source collection of instructions that extend AI coding agents with Knock expertise. Skills enable your AI agent to help you design notifications, write copy, and work with the Knock CLI to manage your notification resources.</p>
<p><video controls muted><source src="https://folziip1jqs60vqj.public.blob.vercel-storage.com/knock-cli-skill.mp4" type="video/mp4" /></video></p>
<h2 id="available-skills">Available skills</h2>
<p>The package ships with two skills today:</p>
<ul>
<li><strong>knock-cli.</strong> Enables your agent to work with the <a href="https://docs.knock.app/developer-tools/knock-cli">Knock CLI</a> to pull, push, and validate workflows, email layouts, guides, and partials. It covers CLI installation and authentication, the Knock directory structure, workflow templates (visual blocks and HTML mode), and building reusable email components with partials.</li>
<li><strong>notification-best-practices.</strong> Comprehensive guidelines for designing and writing effective notifications across all channels, including email, push, SMS, in-app, and chat. It covers channel-specific formatting, copy best practices, system implementation patterns, and template examples for common use cases like signups, payments, collaboration, and alerts.</li>
</ul>
<h2 id="installation">Installation</h2>
<p>You can install the entire skills package with a single command:</p>
<figure data-rehype-pretty-code-figure=""><pre style="background-color:#ffffff;color:#24292eff" tabindex="0" data-language="bash" data-theme="min-light"><code data-language="bash" data-theme="min-light" style="display: grid;"><span data-line=""><span style="color:#6F42C1">npx</span><span style="color:#2B5581"> skills</span><span style="color:#2B5581"> add</span><span style="color:#2B5581"> knocklabs/skills</span></span></code></pre></figure>
<p>Or you can can install specific skills by passing a flag:</p>
<figure data-rehype-pretty-code-figure=""><pre style="background-color:#ffffff;color:#24292eff" tabindex="0" data-language="bash" data-theme="min-light"><code data-language="bash" data-theme="min-light" style="display: grid;"><span data-line=""><span style="color:#6F42C1">npx</span><span style="color:#2B5581"> skills</span><span style="color:#2B5581"> add</span><span style="color:#2B5581"> knocklabs/skills</span><span style="color:#2B5581"> --skill</span><span style="color:#2B5581"> knock-cli</span></span>
<span data-line=""><span style="color:#6F42C1">npx</span><span style="color:#2B5581"> skills</span><span style="color:#2B5581"> add</span><span style="color:#2B5581"> knocklabs/skills</span><span style="color:#2B5581"> --skill</span><span style="color:#2B5581"> notification-best-practices</span></span></code></pre></figure>
<p>Once installed, skills are automatically available to your agent and activated when relevant tasks are detected.</p>
<p>The skills package is open source and available on <a href="https://github.com/knocklabs/skills">GitHub</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sources 2.0]]></title>
            <description><![CDATA[A new design for ingesting events from third-party tools into Knock.]]></description>
            <link>https://knock.app/changelog#2026-02-13</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-02-13</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 13 Feb 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're sharing a redesigned sources experience in the Knock dashboard.</p>
<p>Knock sources enable you to integrate platforms like Segment, RudderStack, Hightouch, and Census to trigger workflows, identify users, and automate actions.</p>
<p>The new design is available today on the <strong>Sources</strong> page in the main dashboard sidebar. Here's what's new:</p>
<h2 id="new-source-setup-experience">New source setup experience</h2>
<p>Connecting a source to Knock is now only two steps.</p>
<p><video controls muted><source src="/assets/changelog/sources-design-2026/setup-2.mp4" type="video/mp4" /></video></p>
<h2 id="improved-field-mapping-experience">Improved field mapping experience</h2>
<p>A new interface makes it easy to map incoming event data to actions in Knock. You can now view the past events for an event type and connect the action fields directly.</p>
<p><img
src="/assets/changelog/sources-design-2026/mappings.png"
alt="New mapping experience"
class="border border-gray-200 rounded-md"
/></p>
<h2 id="improved-event-observability">Improved event observability</h2>
<p>An improved logs page makes it easy to see events streaming in, how Knock handles them, and the actions taken as a result.</p>
<p><video controls muted><source src="/assets/changelog/sources-design-2026/logs.mp4" type="video/mp4" /></video></p>
<h2 id="workflow-mapping-improvements">Workflow mapping improvements</h2>
<p>We also upgraded source event trigger steps: view past event shapes, validate mappings inline, and send test events to preview how workflows will run.</p>
<p><video controls muted><source src="/assets/changelog/sources-design-2026/panel-mapping.mp4" type="video/mp4" /></video></p>
<p>These changes are available today for all Knock customers.</p>
<p>Read more about Knock event ingestion through integration sources in <a href="https://docs.knock.app/integrations/overview" target="_blank" rel="noopener noreferrer">our docs</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Datetime conditions support]]></title>
            <description><![CDATA[Use datetime operators in the conditions builder to filter timestamp properties across workflows, broadcasts, and guides.]]></description>
            <link>https://knock.app/changelog#2026-02-10</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-02-10</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 10 Feb 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're shipping datetime operators in the conditions builder so you can work with time more easily in your branches and conditions.</p>
<p>The timestamp operators ("is a timestamp before," "is a timestamp on or after," and "is a timestamp between") accept timestamp arguments in three formats:</p>
<ul>
<li><strong>Relative.</strong> A time relative to when the condition is evaluated. Relative timestamps include a value, a unit (minutes, hours, days, or weeks), and a modifier ("from now" or "ago"). For example, "7 days ago" or "3 days from now".</li>
<li><strong>Absolute.</strong> A fixed date and time. In JSON, this is represented in ISO 8601 format (e.g., "2025-06-15T14:30:00Z").</li>
<li><strong>Dynamic.</strong> A Liquid template variable that resolves to a timestamp at runtime (e.g., <code>{{ recipient.subscription_ends_at }}</code>). Dynamic timestamp arguments are available in workflows, broadcasts, and guides.</li>
</ul>
<p>With these datetime conditions, you can now:</p>
<ul>
<li>Trigger a reminder workflow when <code>{{ recipient.appointment_date }}</code> is a timestamp on or after 24 hours from now, so users get a reminder email one day before their appointment.</li>
<li>Send a CVE alert only when <code>{{ tenant.created_at }}</code> is a timestamp between 2026-01-01T09:00:00Z and 2026-01-15T09:00:00Z, so only tenants onboarded during the affected window receive a sensitive notice.</li>
<li>Trigger a trial survey when <code>{{ recipient.trial_ends_at }}</code> is a timestamp on or after 14 days ago, so you only reach out at the right moment.</li>
</ul>
<p>These operators are available today for all Knock customers. <a href="https://docs.knock.app/concepts/conditions">Read more</a> about datetime conditions in the docs.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Partials 2.0]]></title>
            <description><![CDATA[Powerful improvements for building reusable, componentized email templates with partials.]]></description>
            <link>https://knock.app/changelog#2026-01-28</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-01-28</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 28 Jan 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're shipping Partials 2.0. <a href="https://docs.knock.app/template-editor/partials/overview">Partials</a> are pre-built components that can be used across templates to quickly create beautiful messages and ensure brand consistency across every message your team sends.</p>
<p>Here's what’s new:</p>
<ul>
<li><strong>Custom brand attributes.</strong> Define brand colors and attributes using <code>vars.branding.*</code> variables. Update your design system in one place and have changes propagate across all templates.</li>
<li><strong>Schemas for partial inputs.</strong> Partials now support optional input schemas for field types, labels, descriptions, and required flags, so editors can move faster without breaking brand or content guidelines. Schemas are versioned with the partial, making it easy to manage changes over time.</li>
<li><strong>JSON object support for partial inputs.</strong> Partials now accept JSON objects through markdown inputs. This enables passing complex data like objects and lists instead of only strings.</li>
<li><strong>Isolated CSS styles.</strong> HTML partials now support isolated <code>&#x3C;style></code> tags that inject into the email <code>&#x3C;head></code> only when the partial is used. Styles are deduplicated and pollute your root stylesheet.</li>
<li><strong>Improved discoverability in the visual editor.</strong> All partials are now visible directly in the block editor, with search support to quickly find components.</li>
<li><strong>Configurable editor experience.</strong> Default blocks (buttons, text, images, etc.) can now be disabled at the account level, limiting editors to use partials to enforce brand consistency.</li>
</ul>
<p>These improvements are available today for all Knock customers. Read <a href="https://docs.knock.app/template-editor/partials/overview">the documentation</a> to learn more about building reusable email components with partials.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Delivery status checks via webhooks]]></title>
            <description><![CDATA[Receive delivery status updates from your email and SMS providers via webhooks.]]></description>
            <link>https://knock.app/changelog#2026-01-23</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-01-23</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 23 Jan 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're releasing webhook-backed delivery statuses, enabling you to receive delivery status updates directly from your email and SMS providers via webhooks.</p>
<p>Previously, delivery status checks in Knock were only possible via a sophisticated polling mechanism. At high message volumes, this polling had the potential to run into API rate limits imposed by messaging providers. Now, with delivery status webhooks, providers push delivery status changes back to Knock via webhooks. This makes the system more reliable as a whole and not susceptible to rate limits.</p>
<p>With delivery status webhooks enabled for your channels, you can:</p>
<ul>
<li><strong>Track successful deliveries.</strong> See when messages are delivered to the recipient's mail server or carrier.</li>
<li><strong>Monitor bounces.</strong> Get notified when emails bounce due to invalid recipients or domains.</li>
<li><strong>Better debugging.</strong> Understand delivery issues in real-time to troubleshoot notification problems.</li>
</ul>
<p>We currently support delivery status webhooks for the following providers:</p>
<ul>
<li><strong>Email.</strong> <a href="https://docs.knock.app/integrations/email/aws-ses">AWS SES</a>, <a href="https://docs.knock.app/integrations/email/resend">Resend</a>, <a href="https://docs.knock.app/integrations/email/postmark">Postmark</a>, <a href="https://docs.knock.app/integrations/email/sendgrid">SendGrid</a>, and <a href="https://docs.knock.app/integrations/email/mailgun">Mailgun</a></li>
<li><strong>SMS.</strong> <a href="https://docs.knock.app/integrations/sms/twilio">Twilio</a></li>
</ul>
<p>To get started, configure the webhook endpoint in your provider's dashboard to point to Knock. Each provider has specific setup instructions in our documentation.</p>
<p>Delivery status webhooks are available today for all Knock customers. Read <a href="https://docs.knock.app/send-notifications/message-statuses#delivery-status-tracking">the documentation</a> to learn more about setting up delivery status webhooks for your channels.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Production write access]]></title>
            <description><![CDATA[Modify resources in any environment.]]></description>
            <link>https://knock.app/changelog#2026-01-22</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-01-22</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 22 Jan 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Production write access enables you to create and update content resources in any environment, without requiring promotion from development.</p>
<p>This feature is enabled by default for all new customers. If you're an existing customer, production write access is an opt-in setting. To enable production write access, navigate to the <strong>Permissions</strong> page under the <strong>Admin</strong> section of your account settings.</p>
<p>When you enable production write access in your account:</p>
<ol>
<li>
<p><strong>All roles with edit permissions can edit resources in any environment.</strong> Owner, admin, and member roles can create and edit content resources (like workflows and guides) directly in production.</p>
</li>
<li>
<p><strong>The Production-only Member role becomes available.</strong> This role gives a user access to the production environment, and no others. It enables non-technical team members to work in production without touching any resources that are managed in development. <a href="https://docs.knock.app/manage-your-account/roles-and-permissions#production-write-access-and-roles">Learn more about the Production-only Member role</a>.</p>
</li>
<li>
<p><strong>Content resources can only be edited in the environment in which they were created.</strong> This means that any content resources you want to follow your environment lifecycle (create in development, promote to production) are only editable in development. For use cases that don't need the governance of environment promotion, you can create directly in production.</p>
</li>
</ol>
<p>Production write access keeps production-critical resources (like high-volume transactional workflows) version controlled by the development environment, while enabling marketing and product teams to work in a simpler, production-only way for lifecycle journeys and product announcements.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Asset management]]></title>
            <description><![CDATA[Upload, organize, and reuse images across your Knock templates.]]></description>
            <link>https://knock.app/changelog#2026-01-15</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-01-15</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 15 Jan 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're releasing asset management, a centralized way to upload, host, and manage image files directly in Knock for use in your messaging templates.</p>
<p>With asset management, you can now:</p>
<ul>
<li><strong>Store assets directly in Knock.</strong> Upload and store images like logos, icons, and graphics in your Knock account without needing external hosting.</li>
<li><strong>Reuse assets across templates.</strong> Browse and insert uploaded assets into any message template with a single click. No more copying and pasting URLs.</li>
<li><strong>Centralized control.</strong> Assets live in one place and are referenced everywhere, so you can update visuals across messages without touching templates, making it easier to keep your brand assets consistent.</li>
</ul>
<p>Currently, only image files are supported, including PNG, JPEG, GIF, and SVG. In the future, we may support additional asset types.</p>
<p>Asset management is available today for all Knock customers. Navigate to <strong>Content</strong> > <strong>Assets</strong> to upload and manage your assets, or read <a href="https://docs.knock.app/manage-your-account/managing-assets">the documentation</a> to learn more.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[API key management]]></title>
            <description><![CDATA[Create multiple API keys per environment and revoke them directly from the dashboard.]]></description>
            <link>https://knock.app/changelog#2026-01-13</link>
            <guid isPermaLink="false">https://knock.app/changelog#2026-01-13</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 13 Jan 2026 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're releasing API key management, giving you more control over how you authenticate with Knock.</p>
<p>Previously, each environment in Knock had a single public and secret API key pair. This meant all of your integrations shared the same credentials, which made it difficult to rotate keys or limit access for specific use cases.</p>
<p>With API key management, you can now:</p>
<ul>
<li><strong>Create multiple API keys.</strong> Generate as many public and secret key pairs as you need per environment, enabling you to use dedicated keys for different services, integrations, or team members.</li>
<li><strong>Revoke keys instantly.</strong> If a key is compromised or no longer needed, you can revoke it directly from the dashboard without affecting your other integrations.</li>
<li><strong>Better security practices.</strong> Rotate keys on your own schedule and scope credentials to specific parts of your infrastructure.</li>
</ul>
<p>API key management is available today for all Knock customers. You can manage your API keys from the <strong>Settings</strong> > <strong>API keys</strong> page in the dashboard, or read <a href="https://docs.knock.app/api-reference/overview/api-keys">the documentation</a> to learn more.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[CLI 1.0]]></title>
            <description><![CDATA[We're releasing the 1.0 version of the Knock CLI. Now with support for personal logins, branching, and more.]]></description>
            <link>https://knock.app/changelog#2025-12-30</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-12-30</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 30 Dec 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Since we launched our <a href="/blog/announcing-knock-cli">CLI back in May 2023</a>, teams have used it to work with their Knock-powered notifications in code and to programmatically manage their messaging infrastructure, making Knock an extension of their development workflow.</p>
<p>Today, we're thrilled to launch the 1.0 release of the CLI, with a whole host of new features and improvements to make working with Knock locally and in your CI/CD pipeline even easier.</p>
<p>With the 1.0 release of the CLI you can now:</p>
<ul>
<li>Login to the CLI using your Knock account, without needing a service token via <code>knock login</code></li>
<li>Initialize a central <code>knock.json</code> file for your project, and use that for all pull and push commands without specifying where your Knock directory is located</li>
<li>Work with all versioned resources in Knock (workflows, templates, guides, layouts, translations), commit and promote changes, list environments and channels, and <a href="https://docs.knock.app/cli">much more</a></li>
<li>Create new resources directly without going to the Knock dashboard, or from our new template repository via <code>knock workflow new</code></li>
</ul>
<p>We've also included JSON schemas for all of your resource definitions, providing an editing assist and type hints in your IDE for you and your favorite coding agent like Cursor, Copilot, or Claude Code.</p>
<p>CLI 1.0 is also fully compatible with our new <a href="https://docs.knock.app/version-control/branches">branching beta</a>. Using the CLI you can create branches, push and pull changes on those branches, and merge changes from your branch back into main when complete.</p>
<p>If you're interested in trying out the 1.0 release of the CLI, you can get started by running <code>npm install -g @knocklabs/cli</code> or <code>brew install knocklabs/tap/knock</code>. You can also read <a href="https://docs.knock.app/cli">the documentation</a> to get started.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Branching beta]]></title>
            <description><![CDATA[A new way for developers to work independently in isolated branches.]]></description>
            <link>https://knock.app/changelog#2025-12-18</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-12-18</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 18 Dec 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're excited to announce the beta release of branching, a new way for developers to work together in Knock.</p>
<p>Previously, all changes to versioned content in Knock had to be made in your development environment. That meant if you had multiple developers using Knock, changes needed to be carefully coordinated.</p>
<p>With branching, each developer can make changes in an isolated branch. Once changes are complete, the branch can be safely merged back into the development environment.</p>
<p>Branch management is deeply integrated into our <a href="https://docs.knock.app/mapi-reference/branches/list">management API</a> and <a href="https://docs.knock.app/cli/branch/list">CLI</a>, allowing you to use branching as a part of your everyday developer workflow or automate branches with your CI/CD pipeline. In addition, branching makes it possible to use Knock in preview environments, like those used by Vercel or Netlify. That means your team can test notification workflows end to end alongside other feature changes.</p>
<p>Branching unlocks an even better developer workflow within Knock, and we're excited to make it available today to all customers. If you're interested in trying out branching, you can request access from the dashboard on the <strong>Settings</strong> > <strong>Branches</strong> page. You can learn more in <a href="https://docs.knock.app/version-control/branches">our documentation</a>.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dynamic audiences beta]]></title>
            <description><![CDATA[Build dynamic audiences that update in real-time on top of your Knock user data.]]></description>
            <link>https://knock.app/changelog#2025-12-11</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-12-11</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 11 Dec 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we’re excited to announce the beta release of dynamic audiences.</p>
<p>Dynamic audiences are segments of users you can use to trigger workflows, target guides, or build broadcast lists. You can also use dynamic audiences in your workflow conditions and branches to check if a user is in an audience and route them accordingly.</p>
<p>Here are a few use cases you can power with dynamic audiences:</p>
<ul>
<li>Target a guide announcing an enterprise plan feature to your enterprise admin audience</li>
<li>Trigger your new user onboarding workflow when a user enters your new signups audience</li>
<li>Send a re-engagement broadcast to your "has not logged in for 30 days" broadcast</li>
</ul>
<p>Dynamic audiences run on the user data you already manage in Knock and are updated in real-time. We built dynamic audiences to be fast and ready to work at the scale of our largest customers.</p>
<p><video controls muted><source src="/assets/changelog/dynamic-audiences-demo.mp4" type="video/mp4" /></video></p>
<p>As of today's release, our segmentation engine works with users and user properties. We'll be adding support for source events and object/tenant data next.</p>
<p>If you're interested in trying out dynamic audiences, <a href="mailto:support@knock.app?subject=Dynamic%20audiences%20beta%20access">let us know</a> and we'll get you set up. You can learn more about dynamic audiences in <a href="https://docs.knock.app/concepts/audiences">our documentation</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Custom link-tracking domains]]></title>
            <description><![CDATA[We've added the ability for you to set up custom link tracking domains from within the dashboard.]]></description>
            <link>https://knock.app/changelog#2025-12-04</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-12-04</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 04 Dec 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we’re introducing custom domains for <a href="https://docs.knock.app/send-notifications/tracking">link and open tracking</a> for all Knock customers.</p>
<p>This allow you to use domains you own—rather than an auto-generated URL like <code>e1.knock.app</code>—for all tracked links in your messages. Aligning your tracking domains with your sending domain reduces the likelihood of spam filters flagging your messages and increases trust from users who expect links to come from you, not a third party.</p>
<p>Custom domains support granular configuration per message type and per environment. That means you can set up specific domains for specific purposes, such as one domain for short SMS links and another for long-form email URLs.</p>
<p>Custom domains are available today for all Knock customers. You can find out more in <a href="https://docs.knock.app/manage-your-account/custom-domains">our documentation</a>.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Recipient selection improvements]]></title>
            <description><![CDATA[We've made improvements to the way you work with recipients within the workflow and broadcast builder.]]></description>
            <link>https://knock.app/changelog#2025-12-02</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-12-02</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 02 Dec 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>We've made a number of improvements to reduce friction when working with recipients in the workflow and broadcast builder.</p>
<ol>
<li><strong>Recipient always selected</strong>. When you open a workflow or broadcast, a recipient is now automatically selected so you can preview recipient data in your workflow.</li>
<li><strong>Object recipients</strong>. You can now toggle the recipient or actor field to “object” and select the object you want to use while building and previewing your workflow.</li>
<li><strong>Inline-identify from the recipient selector</strong>. You can now add a new user or object directly from the recipient selector, without needing to navigate away.</li>
<li><strong>Edit users and objects.</strong> A new “Edit” button lets you make changes to user or object properties without leaving the workflow builder.</li>
</ol>
<p>These improvements also extend to the test runner, where you're now able to inline-identify and edit user data.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 [Dashboard] You can now view a diff of uncommitted changes that have been made to versioned resources in the "Changes" tab.</li>
<li>🐛 [Dashboard] We fixed an issue where writing liquid within a JSON template would fail validation.</li>
<li>🐛 [Notification engine] We now validate all chat channel data before processing a chat channel step. Missing data will now show an error.</li>
<li>👀 [Notification engine] We now send a Knock specific <code>User-Agent</code> header for all webhook channel and outbound webhook requests.</li>
<li>🐛 [Dashboard] We fixed an issue where request signing could not be set on reusable requests.</li>
<li>🐛 [Dashboard] We fixed an issue where toggling preferences with conditions would fail via the dashboard.</li>
<li>👀 [API] We now pass through the Slack <code>retry-after</code> ratelimit headers with all Slack requests.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Device-level metadata for push channels]]></title>
            <description><![CDATA[We've added the ability to set per-device metadata for push channels.]]></description>
            <link>https://knock.app/changelog#2025-11-10</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-11-10</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Mon, 10 Nov 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're introducing new device-level metadata for tracking per-device locale and timezones for push channel data. Previously, push channel data was limited to tracking only tokens. Now, with device-level metadata, you can attach an additional <code>timezone</code> and <code>locale</code> field along with your token, and Knock will automatically evaluate them when sending push notifications.</p>
<p>Here's how it works:</p>
<ul>
<li>Using the per-device <code>locale</code> you can <a href="https://docs.knock.app/mapi-reference/translations/schemas/translation">localize</a> push notification content to what your user's device has configured, taking precedence from the <code>locale</code> stored on the user. That means if your device is set to <code>en-GB</code> but your user has <code>en-US</code> on their user properties, any push notifications sent to the device will be generated in British english.</li>
<li>Similarly, using the per-device <code>timezone</code> you can control the precise <a href="https://docs.knock.app/designing-workflows/send-windows">send windows</a> for when a particular device for a user should receive a push notification. This per-device value takes precedence over the user property.</li>
</ul>
<p>Our <a href="https://docs.knock.app/developer-tools/sdks#mobile-sdks">client-side mobile SDKs</a> have been updated with the ability automatically set this data for each device, or if you're using our API directly, you can replace the call to set <code>tokens</code> with a list of <code>devices</code>.</p>
<pre><code class="language-json">{
  "devices": [
    {
      "token": "user_device_token_1",
      "locale": "en-US",
      "timezone": "America/New_York"
    }
  ]
}
</code></pre>
<p>Push device metadata is available today for all customers. You can <a href="https://docs.knock.app/integrations/push/device-metadata">read more in our documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 [Dashboard/mAPI/CLI] You can now opt into a private beta of branching. Head to your "Settings > Branches" page to request access.</li>
<li>👀 [Dashboard] We added the ability to see all subscriptions that a user has from the users detail page.</li>
<li>🐛 [Notification engine] We fixed an issue with our workflow trigger function where some child workflows were not running.</li>
<li>👀 [API] We now expose a <code>channel</code> attached to each message produced from the API and sent via webhooks.</li>
<li>👀 [mAPI] You can now filter commits by one or more <code>resource_type</code> (like workflow) to show all commits associated to that type of resource.</li>
<li>👀 [Notification engine] We added a new <code>compare_versions</code> liquid filter.</li>
<li>👀 [Notification engine] We now send <code>workflow_category</code> as a tag to Datadog and NewRelic when reporting metrics.</li>
<li>👀 [Dashboard] You can now see the "Last login at" for the members of your account.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Per-channel preferences]]></title>
            <description><![CDATA[We've added the ability to set preferences at the channel level.]]></description>
            <link>https://knock.app/changelog#2025-10-31</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-10-31</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 31 Oct 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're introducing a new preference primitive: channel-level preferences.</p>
<p>While we've always had channel type preferences that let you control preferences for all messages sent for that channel type (like email), there were situations where you might have needed to be more granular with exactly what a user is opting out of.</p>
<p>As an example, if you're using our webhook channel to send messages in your workflow to both "PagerDuty" and "Incident.io", you would have no way in our existing preference model to set a preference for each of these channels, as both would be represented under the <code>http</code> channel type.</p>
<p>Now, using per-channel preferences, you can control exactly which channel a user should or should not receive messages from.</p>
<pre><code class="language-json">{
  "channels": {
    // The PagerDuty channel
    "145a7412-2e9a-4ae4-ae2d-cbca4f5308fe": true,
    // The Incident.io channel
    "8b3c9f21-7d4a-4e1b-9c8e-f2a1b5d6c3e9": false
  }
}
</code></pre>
<p>Channel-level preferences work just like channel type preferences in that you can nest them under <code>workflows</code> or <code>categories</code>. They can even be mixed with <code>channel_types</code>.</p>
<pre><code class="language-json">{
  "workflows": {
    "new-incident": {
      "channels": {
        // PagerDuty channel is OFF
        "145a7412-2e9a-4ae4-ae2d-cbca4f5308fe": false
      },
      "channel_types": {
        // All emails
        "email": true
      }
    }
  }
}
</code></pre>
<p>Channel-level preferences are available today for all customers. You can <a href="https://docs.knock.app/preferences/overview#channels-vs-channel-types">read more in our documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 [CLI] All resources pulled by the CLI now have <code>$schema</code> fields attached, making it possible to get an editing assist when working with your schemas locally.</li>
<li>👀 [mAPI] We've introduced new per-channel step level schemas in our OpenAPI spec to aid with editing. Instead of <code>WorkflowChannelStep</code> there's now <code>WorkflowEmailStep</code>, <code>WorkflowInAppFeedStep</code> etc.</li>
<li>👀 [Dashboard] We've made some large performance improvements to the template editor within the dashboard. Previously, large documents with frequent saves were causing the performance of the editor to regress. Now things should be silky smooth!</li>
<li>🐛 [Dashboard] We fixed an issue with the toolbar commands in our template editor.</li>
<li>🐛 [Dashboard] We fixed an issue where autocompleting objects in liquid would show an empty value.</li>
<li>🐛 [Notification engine] We fixed an issue where using a null actor on the workflow trigger step could cause it to fail.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing Guides 1.0]]></title>
            <description><![CDATA[Knock Guides are now in GA.]]></description>
            <link>https://knock.app/changelog#2025-10-09</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-10-09</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 09 Oct 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're excited to release Knock Guides 1.0.</p>
<p>With Guides, you use your own components to power in-app messages that drive activation and upsells. Legacy in-app messaging vendors use external JavaScript libraries that bloat performance and degrade your design. Our component-first infrastructure keeps your app fast and your messaging on-brand.</p>
<h2 id="component-first-in-app-messaging">Component-first in-app messaging</h2>
<p>Guides are managed from the Knock dashboard. Once you hook a component into Knock, it's available for product managers and marketers to draft and preview content for that component, as well as target the audience for the guide and where it should render in your application.</p>
<p><video controls muted><source src="/assets/blog/introducing-guides-1dot0/guide_live_preview.mp4" type="video/mp4" /></video></p>
<h2 id="guide-prioritization-and-throttling">Guide prioritization and throttling</h2>
<p>You can manage guide prioritization and throttling to ensure users see the highest priority guides first and aren't flooded with messages when they log in to your product.</p>
<p><video controls muted><source src="/assets/blog/introducing-guides-1dot0/guide_order.mp4" type="video/mp4" /></video></p>
<h2 id="observability-and-analytics">Observability and analytics</h2>
<p>Knock Guides use the same powerful observability and analytics engine as the rest of Knock. Every guide records per-user events so you understand when users see, interact with, and archive your guides.</p>
<p>All of that data is available for debugging and analysis within the Knock dashboard, and will automatically flow through any extensions you've set up with Knock, like our data warehouse syncs or message event webhooks.</p>
<h2 id="key-benefits">Key benefits</h2>
<ul>
<li><strong>Composable primitives to build what you want.</strong> The guides toolkit provides React components, React hooks, lower-level JavaScript APIs, socket infrastructure so your engineers can build the in-product experience they want.</li>
<li><strong>No performance tax.</strong> No external scripts to load, no performance tax. Your in-app messaging code runs through the same build process as the rest of your app.</li>
<li><strong>Actual inline components.</strong> Complete control over your render lifecycle so you can ship truly embedded messaging without content layout shift, UI jank, or CSS conflicts.</li>
</ul>
<h2 id="get-started">Get started</h2>
<p>Guides are available for all Knock customers starting today. You can get started by reading <a href="https://docs.knock.app/in-app-ui/guides/overview">our documentation</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Reusable requests]]></title>
            <description><![CDATA[Create and reuse request configurations across your workflows.]]></description>
            <link>https://knock.app/changelog#2025-09-30</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-09-30</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 30 Sep 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're introducing reusable requests, making it easy to reuse fetch step configurations across different workflows.</p>
<h2 id="save-reusable-requests">Save reusable requests</h2>
<p>In the dashboard sidebar, you'll see a new "Reusable requests" section. Here you can create and manage your reusable requests that can be used in any fetch step across your workflows.</p>
<p>Once saved, these requests can then be applied to any workflow fetch step, making it easy to maintain consistent configurations across your messaging infrastructure.</p>
<h2 id="apply-reusable-requests-to-workflow-fetch-steps">Apply reusable requests to workflow fetch steps</h2>
<p>Within a workflow fetch step, you'll see a new "Apply template" button. Here you can select a reusable fetch step to instantly inherit its properties. While linked, the fetch step will continue to inherit any changes made to the reusable request's configuration.</p>
<p><video controls muted><source src="/assets/changelog/reusable-requests/apply-step.mp4" type="video/mp4" /></video></p>
<h2 id="ai-generate-reusable-request-configurations">AI-generate reusable request configurations</h2>
<p>We've also added the ability to generate reusable request configurations. This can be done by clicking the "Generate" button in the reusable request editor either during creation or when editing an existing request. This will use the prompt to auto-populate the request configuration.</p>
<p><video controls muted><source src="/assets/changelog/reusable-requests/generate.mp4" type="video/mp4" /></video></p>
<h3 id="more-information">More Information</h3>
<p>To learn more about reusable requests, check out the documentation: <a href="https://docs.knock.app/designing-workflows/fetch-function#reusable-fetch-functions">Reusable fetch functions</a>.</p>
<h2 id="fixes-and-improvements">Fixes and improvements</h2>
<ul>
<li>👀 [Dashboard] Added realtime input validation in the content editor</li>
<li>👀 [Liquid] Added support for partial ISO dates across all of our date helpers</li>
<li>👀 [Dashboard] Added message previews to the Guide message log</li>
<li>👀 [Dashboard] Fixed performance issues in Guide content editor</li>
<li>👀 [SDKs] Added optimistic updates when archiving a message</li>
<li>🐛 [API] Fixed a bug with creating schedules with a null ending_at field</li>
<li>👀 [Dashboard] Added interacted metadata to the guide message log timeline</li>
<li>🐛 [Dashboard] Fixed the width of the HTTP channel button in the workflow step pane</li>
<li>🐛 [Dashboard] Fixed the callout UI within Deactivate workflow modal</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Per-user access to the CLI]]></title>
            <description><![CDATA[Users can now authenticate in the CLI using their Knock account. No service tokens needed.]]></description>
            <link>https://knock.app/changelog#2025-09-17</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-09-17</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 17 Sep 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're releasing a significant improvement to our <a href="https://docs.knock.app/developer-tools/knock-cli">CLI</a> with the ability for any user to log in via their Knock account.</p>
<p>Previously, in order to use the CLI, you would have to use a <a href="https://docs.knock.app/developer-tools/service-tokens">service token</a> to authenticate. Service tokens are great for non-local, shared environments, like when using Knock inside your <a href="https://docs.knock.app/developer-tools/integrating-into-cicd">CICD pipeline</a>. However, for engineers who want to work with their Knock resources locally, requiring them to create a service token was an unnecessary extra step.</p>
<p>Now, Knock users can simply <code>knock login</code> to gain access to the CLI and get started managing their Knock workflows, templates, and more in code. You'll be redirected from the CLI to your browser to authenticate and grant access to your Knock account. Users who have authenticated with the CLI will then be granted the same permissions they have in the dashboard.</p>
<p>We’re excited to make it even easier for you and the engineers in your organization to work with Knock locally via our CLI. You can read more and get started today <a href="https://docs.knock.app/developer-tools/knock-cli">via the docs</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 [Dashboard] We fixed an issue where resetting a variable could set the variable to an empty string, causing the default to not be applied.</li>
<li>🐛 [Dashboard] We fixed an issue with casing of custom fields during CSV upload mapping.</li>
<li>👀 [SDK] We've added the ability to opt out of inline-identify in the JS and React SDKs.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Amazon SNS Push support]]></title>
            <description><![CDATA[We've added support for sending push notifications via Amazon's Simple Notification Service (SNS).]]></description>
            <link>https://knock.app/changelog#2025-09-09</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-09-09</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 09 Sep 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're releasing support for sending push notifications via Amazon's Simple Notification Service (SNS). Previously, if you wanted to send push notifications you would have to setup a direct connection with FCM or APNS, or use OneSignal or Expo.</p>
<p>Now, with our support for Amazon SNS you can route push notifications from Knock through <a href="https://aws.amazon.com/sns/">Amazon's SNS infrastructure</a>. Our SNS integration even has support for <a href="https://docs.knock.app/integrations/push/token-deregistration">automated deregistration</a> should the user's device token no longer be valid.</p>
<p>You can read more in our <a href="https://docs.knock.app/integrations/push/aws-sns">integration documentation</a>, or can get started today using Amazon SNS by creating and configuring it as a <a href="https://docs.knock.app/concepts/channels">channel</a> within your Knock account.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 [Dashboard] We fixed an issue where the "Request access" button for the APNS + FCM channel group was causing an error.</li>
<li>🐛 [Dashboard] We fixed an issue where accessing the conditions builder could cause the application to error in certain situations.</li>
<li>🐛 [Dashboard] We fixed an error where the template changes toast message would appear erroneously when expanding or collapsing variables in the state pane.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Knock-powered default email channel]]></title>
            <description><![CDATA[All new Knock accounts now get a Knock-powered default email channel out of the box, without needing to configure a third party.]]></description>
            <link>https://knock.app/changelog#2025-09-04</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-09-04</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're releasing our <a href="https://docs.knock.app/integrations/email/knock-test">Knock-powered default email channel</a>, giving all new Knock accounts the ability to start sending emails, without needing to setup a third party provider.</p>
<p>Using the new Knock-powered email channel, you'll be able to send <strong>up to 100 emails</strong> from your Knock account per-month for free, perfect for testing or for small side projects. The limit is per-account, so includes both your development and production environments. Once the monthly limit is reached your messages will stop being delivered until it's reset on the first of the month.</p>
<p>You'll find the new Knock-powered default email channel waiting for you once you create a new Knock account. From there, you can select the channel as you're building your workflows or broadcasts to start sending emails to your users.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 [Dashboard] We fixed an issue with broadcasts where if your broadcast contained channel steps under a branch, the broadcast would be marked as invalid.</li>
<li>🐛 [Dashboard] We fixed an issue where the <code>tenant</code> in the autocomplete in the template editor would not display any custom properties.</li>
<li>🐛 [API] We fixed an issue where a schedule couldn't be created for a tenant.</li>
<li>🐛 [Notification engine] We fixed an issue where SMS to overrides were not being respected.</li>
<li>🐛 [SDKs] We fixed an issue where some fields on the <code>Message</code> schema were not correctly marked as required.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New sidebar navigation]]></title>
            <description><![CDATA[A new sidebar navigation experience]]></description>
            <link>https://knock.app/changelog#2025-08-15</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-08-15</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 15 Aug 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we’re releasing a revamped dashboard sidebar, making it easier than ever to work with Knock. As we’ve added more features and sections to the Knock sidebar, many of you have told us that it’s difficult to find your way around.</p>
<p>With our new, reworked information architecture, we’ve made it easier than ever to find what you need in the Knock dashboard, and to move across the environments you have configured within Knock.</p>
<p>We’ve also gone ahead and moved a few items into the “Settings” page, so they’re better classified as what they are. You’ll find that we also gave the sidebar within the setting section on your account an overhaul to better logically group different areas.</p>
<p>All of these changes have rolled out to all users today.</p>
<p><video controls muted><source src="https://folziip1jqs60vqj.public.blob.vercel-storage.com/sidebar-demo.mp4" type="video/mp4" /></video></p>
<h2 id="new-sidebar-with-sections">New sidebar with sections</h2>
<p>The new sidebar groups related areas into clear sections and keeps primary actions in reach. Workflows, Broadcasts, and Commits sit at the top for quick access, while Content, Recipients, Observability, and Platform organize the rest. You can collapse sections to reduce noise and stay focused.</p>
<h2 id="top-level-environment-switcher">Top-level environment switcher</h2>
<p>The environment switcher now lives at the top of the dashboard, visible on every page with a new, refreshed look.</p>
<p><img
src="/assets/changelog/new-nav/env-picker.png"
alt="Environment switcher at the top of the dashboard"
class="border border-gray-200 rounded-md"
/></p>
<h2 id="new-settings-page">New settings page</h2>
<p>Settings have a new left sidebar that groups controls by account, version control, integrations, and admin. <strong>Channels</strong>, <strong>Integrations</strong>, and <strong>Sources</strong> now live here under integrations, so provider setup and data connections sit alongside the rest of your workspace settings.</p>
<p><img
src="/assets/changelog/new-nav/settings.png"
alt="Settings page with a new left sidebar"
class="border border-gray-200 rounded-md"
/></p>
<h2 id="new-account-dropdown">New account dropdown</h2>
<p>The account menu is streamlined with quick access to your settings, channels and sources page, accounts, and sign out. Organization switching is easier to see and faster to use.</p>
<p><img
src="/assets/changelog/new-nav/account-dropdown.png"
alt="New account dropdown"
class="border border-gray-200 rounded-md"
/></p>
<h2 id="new-help-menu">New help menu</h2>
<p>The help menu provides quick links to docs, API reference, and our <a href="https://knock.app/join-slack">Slack community</a>. You can also share feedback and contact support in one click.</p>
<p><img
src="/assets/changelog/new-nav/help-menu.png"
alt="New help menu"
class="border border-gray-200 rounded-md"
/></p>
<h2 id="fixes-and-improvements">Fixes and improvements</h2>
<ul>
<li>🐛 [Dashboard] We fixed a variety of small issues that would cause the dashboard to error.</li>
<li>🐛 [SDK] We fixed token signing in Cloudflare Workers.</li>
<li>👀 [Dashboard] When creating new channel step, the selection will default to your email channel when there is only one.</li>
<li>🐛 [SDK] We fixed a bug when listing users in the Node SDK.</li>
<li>👀 [Dashboard] We added filters to the Broadcast messages log.</li>
<li>👀 [Dashboard] The CMD+DEL shortcut no longer deletes the entire block in the template editor.</li>
<li>🐛 [Dashboard] We fixed a bug when trying to select a different webhook channel.</li>
<li>👀 [SDK] Microsoft recently deprecated multi-tenant bot registration, so we now support sending notifications as Microsoft Teams bots registered with Azure as single-tenant.</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Per-recipient broadcast data + CSV uploader refresh]]></title>
            <description><![CDATA[Upload users with one-time-use data for broadcasts with our new CSV uploader]]></description>
            <link>https://knock.app/changelog#2025-07-24</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-07-24</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 24 Jul 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're excited to introduce a completely rebuilt CSV uploader that makes it faster and easier than ever to upload users for broadcasts, with a powerful new feature that lets you include ephemeral data that won't clutter your user schema.</p>
<p><video controls muted><source src="/assets/changelog/csv_uploader_broadcast_data/csv-demo.mp4" type="video/mp4" /></video></p>
<h2 id="lightning-fast-uploads-with-instant-feedback">Lightning-fast uploads with instant feedback</h2>
<p>We've rebuilt the CSV uploader from the ground up with performance in mind. The uploader now opens instantly and processes uploads in seconds, giving you real-time feedback as users are added to your broadcast or audience. You'll see the user count update live as your file is processed, making it easy to track progress and confirm your upload is working as expected.</p>
<p><video controls muted><source src="/assets/changelog/csv_uploader_broadcast_data/upload-mov.mp4" type="video/mp4" /></video></p>
<h2 id="streamlined-column-mapping-with-full-control">Streamlined column mapping with full control</h2>
<p>The new mapping interface gives you complete control over your data. You can easily add new columns, rename incoming columns, or skip unnecessary ones. This flexibility means you can work with any CSV structure without having to modify your files beforehand.</p>
<h2 id="per-recipient-broadcast-data">Per-recipient broadcast data</h2>
<p>Here's the game-changer: when uploading users for a broadcast, you can now categorize CSV fields as either "user data" or "broadcast data". User data gets saved to your user schema as usual, but broadcast data is used only for that specific broadcast.</p>
<p><img
src="/assets/changelog/csv_uploader_broadcast_data/mapping_step.png"
alt="Categorizing data as user or broadcast fields"
class="border border-gray-200 rounded-md"
/></p>
<p>This is perfect for including one-time information like:</p>
<ul>
<li><strong>Promotional discount codes</strong> unique to each recipient but not necessary to reuse</li>
<li><strong>Event-specific details</strong> like seat numbers or session times</li>
<li><strong>Usage metrics</strong> relevant only to that broadcast</li>
</ul>
<p>Previously, if you wanted to include this type of data in your broadcasts, you'd have to store it permanently on your user records with no easy way to clean it up later. Now you can keep your user schema clean while still personalizing broadcasts with rich, contextual data.</p>
<h2 id="save-uploaded-users-as-reusable-audiences">Save uploaded users as reusable audiences</h2>
<p>When uploading users to a broadcast, you still have the option to save them as a new audience that can be reused for future broadcasts. This makes it easy to build and maintain audience segments without having to re-upload the same users repeatedly.</p>
<p><img
src="/assets/changelog/csv_uploader_broadcast_data/save_new_audience.png"
alt="Option to save uploaded users as a new audience"
class="border border-gray-200 rounded-md"
/></p>
<h2 id="fixes-and-improvements">Fixes and improvements</h2>
<ul>
<li>🐛 [In app feed] We fixed an issue where the realtime feed didn't update after marking all archived.</li>
<li>🐛 [CLI] We fixed a regression with the <code>push all</code> command in the CLI.</li>
<li>🐛 [Dashboard] We fixed an issue where searching for a source event with a space would return no results.</li>
<li>🐛 [Dashboard] We fixed an issue where setting user preferences in the UI would fail even though setting via the API worked for the same payload.</li>
<li>🐛 [Dashboard] We fixed an issue where workflow categories with spaces would break.</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Contextual commit flow]]></title>
            <description><![CDATA[Introducing a new version control tab for resources]]></description>
            <link>https://knock.app/changelog#2025-07-17</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-07-17</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 17 Jul 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're excited to share a new Changes tab on every versionable resource in the Knock dashboard and an improved commits experience.</p>
<p><video controls muted><source src="https://folziip1jqs60vqj.public.blob.vercel-storage.com/commits-ux-render.mp4" type="video/mp4" /></video></p>
<h2 id="new-tab-for-resource-specific-version-control">New tab for resource-specific version control</h2>
<p>On versionable resource pages, we introduced a new tab titled "Changes". This tab gives you a more detailed view of the changes you've made to your resource. You can see the changes you've made, the commits that need promoting, and a history of when your resource was last promoted.</p>
<p><img
src="/assets/changelog/commits-ux/changes-tab.png"
alt="changes tab"
class="border border-gray-200 rounded-md"
/></p>
<p>You'll also be able to see the historical commits for that resource, enabling full visibility into the changes that have been made to your resource over time.</p>
<p><img
src="/assets/changelog/commits-ux/commit-history.png"
alt="commit history"
class="border border-gray-200 rounded-md"
/></p>
<h2 id="commit-and-promote-changes-directly-from-any-resource">Commit and promote changes directly from any resource</h2>
<p>We've added the ability to commit and promote changes directly from any resource. This means you can now make changes to a workflow, email layout, or any other versionable resource and commit those changes without leaving the page. The new commit flow provides a clear summary of your changes and lets you add a descriptive message before committing.</p>
<p><video controls muted><source src="/assets/changelog/commits-ux/top-level-commit-promote.mp4" type="video/mp4" /></video></p>
<p>Once committed, you can promote those changes to the next environment too, right from the resource page. This streamlines the process of moving changes through your environments.</p>
<h2 id="view-changes-across-environments">View changes across environments</h2>
<p>The new changes tab also enables you to view the overall status of your resource across environments. Previously, it was difficult to know when a resource had unpromoted commits in other environments. Now, we have a special indicator that introduces a visual cue to help you identify when a resource has uncommitted changes or unpromoted commits in other environments.</p>
<p><img
src="/assets/changelog/commits-ux/environment-diff.png"
alt="unpromoted commits"
class="border border-gray-200 rounded-md"
/></p>
<p>And when a resource is synchronized across all environments and in production, you'll see a green checkmark to indicate that the resource in its current state is live in production and the same across all environments.</p>
<p><img
src="/assets/changelog/commits-ux/success.png"
alt="unpromoted commits"
class="border border-gray-200 rounded-md"
/></p>
<h2 id="fixes-and-improvements">Fixes and improvements</h2>
<ul>
<li>🐛 [MCP] We fixed an issue where creating a new partial from the MCP server crashes partials list.</li>
<li>👀 [Dashboard] We added filtering for messages under users/tenants/objects.</li>
<li>👀 [Dashboard] We improved the translation editing experience.</li>
<li>👀 [Dashboard] Introduced breadcrumb navigation for the dashboard.</li>
<li>🐛 [Dashboard] We fixed an issue where previewing a message would mark it as "read" inadvertently.</li>
<li>👀 [Docs] We added Guides tooling to the Agent Toolkit docs.</li>
<li>👀 [SDK] We added a <code>usePreferences</code> hook to the React SDK.</li>
<li>🐛 [API] We fixed an issue with plaintext link parsing.</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Javascript SDK improvements and RSC support]]></title>
            <description><![CDATA[Javascript SDK improvements and RSC support]]></description>
            <link>https://knock.app/changelog#2025-07-02</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-07-02</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 02 Jul 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we’re excited to share a set of improvements to our JavaScript SDKs that make them more flexible, modern, and easier to work with across environments.</p>
<p>Our <code>@knocklabs/react</code> package now has support for React Sever Components. This unlocks full compatibility  with Next.js App Router and other frameworks, allowing you to use the SDK in both server and client components.</p>
<p>We migrated our internal store from <code>zustand</code> to <code>@tanstack/store</code>. This means finer control over state updates, better TypeScript support, and a smaller overall bundle size. It also unifies store logic across packages, reducing the surface area for bugs and improving long-term maintainability.</p>
<p>Finally, we’ve revamped our release pipeline to support canary and release candidate (RC) versions. Teams can now opt into early versions of our SDKs, test upcoming changes, and provide feedback before a stable release. With this change, we will now ship fixes and features more confidently, with a clear and gradual path to general availability.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 [Dashboard] We fixed an issue where the "Alerts" workflow template was broken.</li>
<li>🐛 [Dashboard] We fixed an issue with the search input when interacting with it from the Command+K menu.</li>
<li>🐛 [Dashboard] We fixed an issue where the "Discard changes" button didn’t work in the translations editor.</li>
<li>🐛 [Dashboard] We fixed an issue where the diff viewer was cut off in Safari.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Guides scheduling and analytics]]></title>
            <description><![CDATA[We've shipped the ability to schedule guides, and we've added an analytics summary to guides.]]></description>
            <link>https://knock.app/changelog#2025-06-16</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-06-16</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Mon, 16 Jun 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're excited to announce scheduling and analytics for guides. These features give you more control over when your guides are active and provide insight into how they're performing.</p>
<p>With guides scheduling, you can now control exactly when your guides activate and deactivate. This is perfect for time-sensitive announcements, seasonal promotions, and other in-product messaging.</p>
<p>We've also added an analytics summary for guides, giving you visibility into how your in-product messages are performing. The summary shows total potential audience size and the number of users who have seen, interacted with, and archived a guide. You can view these metrics as either raw numbers or as percentages of the total audience.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 [Dashboard] We fixed an issue where breadcrumbs were not displaying correctly on some pages.</li>
<li>🐛 [Dashboard] We fixed an issue where updates to brand settings did not live update the branding preview.</li>
<li>🐛 [Dashboard] We fixed an issue where opening links in a message preview would break the preview.</li>
<li>🐛 [Dashboard] We fixed an issue where the template editor could crash when selecting a source event trigger for API-triggered workflows.</li>
<li>🐛 [Dashboard] We fixed an issue related to drag &#x26; drop and the trigger workflow step.</li>
<li>👀 [Dashboard] We moved email template settings like from address directly into the template editor to simplify email editing.</li>
<li>👀 [Dashboard] We shipped a number of other miscellaneous UI and bug fixes.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Workflow type generation and other CLI improvements]]></title>
            <description><![CDATA[You can now generate workflow trigger data types from the Knock CLI, along with other improvements.]]></description>
            <link>https://knock.app/changelog#2025-06-11</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-06-11</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 11 Jun 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're releasing support for workflow type generation through the <a href="https://docs.knock.app/cli/overview">CLI</a>, making it easy to get end-to-end type safety between your application and the workflows you trigger with Knock.</p>
<p>Getting started with generating types is incredibly easy. You first describe your <a href="https://docs.knock.app/designing-workflows/validating-trigger-data">workflow trigger schema</a> (or generate it using AI), then you can pull workflow type definitions from the Knock CLI:</p>
<pre><code class="language-bash">knock workflow generate-types --output-file=./knock-workflow-types.ts
</code></pre>
<p>Next, within your application, you can import your types and annotate your Knock workflow triggers:</p>
<pre><code class="language-typescript">import { Knock } from "@knocklabs/node";
import { CommentCreatedData } from "./knock-workflow-types";

const knock = new Knock({ apiKey: process.env.KNOCK_API_KEY });

const triggerData: CommentCreatedData = {
  comment_id: "comment_123",
  comment_text: "Great work on this!",
  document_id: "doc_456",
  document_name: "Project Proposal",
  priority: "medium",
  metadata: {
    source: "web_app",
    version: 1,
  },
};

await knock.workflows.trigger("comment-created", {
  recipients: ["user_789"],
  data: triggerData, // ✅ Type-safe!
});
</code></pre>
<p>Your application's compilation will now fail if required data is missing or invalid data types are passed. This ensures that the data your workflow expects is provided.</p>
<p>The Knock CLI currently supports generating types for TypeScript, Go, Python, and Ruby. We may add other languages in the future. Please <a href="mailto:support@knock.app?subject=Workflow+type+generation">get in touch</a> if there's a language you need that we don't currently support.</p>
<p>You can learn more in our guide on <a href="https://docs.knock.app/developer-tools/type-safety">type safety</a> and in the <a href="https://docs.knock.app/cli/workflow/generate-types">CLI documentation</a>.</p>
<h2 id="user-content-other-cli-improvements"><a href="#other-cli-improvements" tabindex="-1"><span></span></a>Other CLI improvements</h2>
<p>We've also added support for two new commands in the Knock CLI:</p>
<ul>
<li><code>knock pull</code>: Pulls down all versionable resources from your Knock account into the specified directory. Using this command, all resources will be pulled under their own directories (like <code>workflows</code>, <code>layouts</code>, <code>partials</code>).</li>
<li><code>knock push</code>: Pushes all resources in your Knock directory up to Knock in a single command, where you can optionally supply a commit message to pass along to commit and push at the same time.</li>
</ul>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 [Dashboard] We fixed an issue where the discard changes button for setting trigger data did not always work</li>
<li>🐛 [Dashboard] We fixed an issue where opening an email preview could have marked a message as "opened" inadvertently</li>
<li>👀 [Dashboard] We improved the categories filter on workflows to be a typeahead</li>
<li>👀 [Notification engine] We added support for a new <code>format_date_in_locale</code> liquid helper</li>
<li>🐛 [API] We fixed an issue with our OpenAPI spec where the set tenant endpoint listed that it accepted <code>preferences</code></li>
<li>🐛 [SDK] We fixed an issue in the React SDK where the <code>useNotifications</code> hook could cause a memory leak</li>
<li>🐛 [Agent toolkit] We fixed an issue where some models would report issues with the tools provided by the MCP server</li>
<li>👀 [Agent toolkit] We added support for updating as well as creating workflow steps</li>
<li>👀 [Agent toolkit] We added support for upserting email layouts</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing email client previews]]></title>
            <description><![CDATA[We're excited to announce that you can now get real previews for email clients, powered by Litmus.]]></description>
            <link>https://knock.app/changelog#2025-05-29</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-05-29</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 29 May 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're excited to announce the introduction of email client previews, giving you the ability to see real previews of how your emails will render, right inside of the Knock template editor.</p>
<p>Previously to see how your email notifications would render you would have to use a combination of our in browser preview, sending tests to yourself via the test runner, and using an external tool, like Litmus. Now, with email client previews, you can see exactly how your email will render on a variety of email clients by just navigating to the "Client previews" tab.</p>
<p>You can access email client previews by going to the "Client previews" tab in the template editor. There you will see a selection of popular email clients, showing a snapshot of how your template will render on each client. Each image can be enlarged, and you can easily navigate between different email client previews by using the keyboard.</p>
<p>Email client previews is available today for all enterprise plan customers. You can <a href="https://docs.knock.app/integrations/email/client-previews">read more in the documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 [API] We fixed an issue where using the bulk create schedules endpoint with a non-existent recipient could cause the process to fail.</li>
<li>🐛 [Dashboard] We fixed an issue where service tokens could not be deleted or renamed.</li>
<li>🐛 [Dashboard] We fixed an issue with archiving email layouts.</li>
<li>🐛 [Dashboard] We fixed an issue where opening the template settings modal on email templates would show an errant error for the JSON overrides field.</li>
<li>🐛 [Dashboard] We fixed some performance issues with the new template editor, leading to slow typing speeds.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing guides]]></title>
            <description><![CDATA[We're excited to introduce guides. Guides enable you to power in-product messaging using your own native components.]]></description>
            <link>https://knock.app/changelog#2025-05-02</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-05-02</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 02 May 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>We're excited to introduce guides.</p>
<p>Guides enable you to power in-product messaging, everything from paywalls and badges, to one-time announcements and banners, using your own native components.</p>
<p>With guides, your engineering team gets complete control over in-product messages and how they’re rendered in your product, while your product and marketing teams get the ability to draft, A/B test, and manage all your native in-product content.</p>
<h2 id="user-content-native-self-serve-and-observable"><a href="#native-self-serve-and-observable" tabindex="-1"><span></span></a>Native, self-serve, and observable</h2>
<p>Here are a few reasons why we think guides will help product and engineering teams:</p>
<ul>
<li><strong>Goodbye &#x3C;script/>. Hello &#x3C;Component/></strong>: Unlike legacy in-app messaging tools that inject JavaScript agents and slow down your app, Knock guides integrate directly with your React, Vue.js, or Angular components. No performance penalties. No UI janking. Complete design system compliance.</li>
<li><strong>Self-service for PMs and marketers</strong>: With guides, product and marketing teams get the ability to draft content, target recipients, and configure message activation in a self-service way, without needing to worry about introducing breaking changes in the frontend.</li>
<li><strong>Built-in analytics and observability</strong>: Guides automatically track delivery and engagement metrics. You can understand how many users are seeing, interacting with, and archiving your in-app guides. We make it easy to deliver that data where you need it, whether that's your data warehouse or CDPs such as Segment or Amplitude.</li>
</ul>
<p>We believe in a future for the internet where software teams can ship in-app messaging that powers adoption, growth, and retention, without having to compromise on performance, web vitals, and content layout shift.</p>
<p>Check out <a href="https://youtu.be/k0pfnmqTzRA">a walkthrough here.</a></p>
<p>Read the <a href="/blog/announcing-guides">full announcement</a>.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Docs 2.0 + new SDKs]]></title>
            <description><![CDATA[We're excited to announce two significant upgrades to developer experience, Docs 2.0 and new auto-generated SDKs.]]></description>
            <link>https://knock.app/changelog#2025-05-01</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-05-01</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 01 May 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>We're excited to announce two significant upgrades to developer experience at Knock, Docs 2.0 and new auto-generated SDKs.</p>
<h2 id="user-content-a-brand-new-docs-experience"><a href="#a-brand-new-docs-experience" tabindex="-1"><span></span></a>A brand new docs experience</h2>
<p>We first shipped our docs site four years ago along with the initial launch of Knock. Since then, the design hasn’t changed, despite us shipping a <em>lot</em> of new content.</p>
<p>We’ve reorganized our content, rebuilt our “building in-app UI” section, and refreshed our API and management API references using the OpenAPI spec.</p>
<p>We have also added support for all your LLM needs, with llms.txt and llms-full.txt, markdown pages, and a new RAG API endpoint for our MCP server.</p>
<p>If you’re interested in peeking behind the curtains for these changes, our docs are open source and <a href="https://github.com/knocklabs/docs">available here</a>.</p>
<h2 id="user-content-new-sdks-for-node-go-python-and-ruby"><a href="#new-sdks-for-node-go-python-and-ruby" tabindex="-1"><span></span></a>New SDKs for Node, Go, Python, and Ruby</h2>
<p>Today, we’re proud to release the 1.0 versions of our SDKs in Node (Typescript), Go, Python, and Ruby. These new SDKs are richly typed and include all resources across our API. They are a joy to use. In addition to typing, they include retries, auto-pagination, customizable logging, and configurable timeouts.</p>
<p>If you’re a current SDK user, our migration guides will provide information on how to migrate to the 1.0 releases of our SDKs. We’re also anticipating that our PHP and .NET SDKs will follow the same generated treatment in the second half of this year.</p>
<p>Check out <a href="https://youtu.be/Tn3QOuKzvTc">a walkthrough here.</a></p>
<p>Read <a href="/blog/announcing-docs-2-and-new-sdks">the full announcement.</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Broadcasts]]></title>
            <description><![CDATA[We're excited to announce broadcasts, a way to send one-time cross-channel messages in Knock.]]></description>
            <link>https://knock.app/changelog#2025-04-30</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-04-30</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 30 Apr 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>We're excited to announce broadcasts, a way to send one-time cross-channel messages in Knock.</p>
<p>Whether you’re announcing a new feature, alerting users about system maintenance, or driving new feature adoption, broadcasts let you create thoughtful cross-channel messaging sequences that reach users where they are.</p>
<p>Unlike traditional workflows in Knock that trigger based on events, broadcasts are scheduled to run once for an audience. And, because broadcasts use our workflow engine under the hood, you can easily build sophisticated cross-channel one-time messaging.</p>
<h2 id="user-content-audiences-preferences-and-analytics"><a href="#audiences-preferences-and-analytics" tabindex="-1"><span></span></a>Audiences, preferences, and analytics</h2>
<p>Along with broadcasts, we are also releasing:</p>
<ul>
<li><strong>Audiences:</strong> You can now create an audience in Knock using CSV upload, through our rETL integrations with Census and Hightouch and via our API.</li>
<li><strong>Commercial preferences and 1-click unsubscribe:</strong> To stay compliant with regulations like CAN -SPAM and CASL, you can set a broadcast (or a workflow) as commercial, which give users the ability to one-click opt-out of any future commercial messaging sent with Knock.</li>
<li><strong>Observability and analytics:</strong> The messages sent by broadcasts are just like any other messages in Knock. You get visibility into all of the same observability and analytics data we provide for trigger-based workflows.</li>
</ul>
<p>Read <a href="https://knock.app/blog/announcing-broadcasts">the full announcement</a>.</p>
<p>Check out <a href="https://youtu.be/7EcZcY1qADI">a demo here</a>.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Workflows 3.0]]></title>
            <description><![CDATA[We're excited to introduce Knock workflows 3.0, the biggest update yet to building and designing cross-channel messaging in Knock.]]></description>
            <link>https://knock.app/changelog#2025-04-29</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-04-29</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 29 Apr 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're excited to introduce Knock workflows 3.0.</p>
<p>Read <a href="https://knock.app/blog/announcing-workflows-3">the full announcement.</a></p>
<p>This is our biggest update yet to building and designing cross-channel messaging in Knock. We redesigned our template editor and our workflow canvas with a renewed focus on:</p>
<ul>
<li><strong>Speed</strong>. All updates are optimistic. You will never see a loading spinner. You can now use keyboard shortcuts for everything.</li>
<li><strong>Ease of use</strong>. Writing an email in Knock is as easy as writing a doc in Notion.</li>
<li><strong>Quality control</strong>. We’ve overhauled error handling and introduced AI powered auto-fix suggestions to debug more complex issues</li>
</ul>
<p>Check out <a href="https://youtu.be/TX7V8nFTuJw">a demo here.</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Knock Agent Toolkit and MCP server]]></title>
            <description><![CDATA[We've shipped a new library called Agent Toolkit for using Knock to power cross-channel agent messaging and human-in-the-loop flows, also accessible via MCP server.]]></description>
            <link>https://knock.app/changelog#2025-04-28</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-04-28</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Mon, 28 Apr 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we’re thrilled to introduce <a href="https://docs.knock.app/developer-tools/agent-toolkit/overview">Knock Agent Toolkit</a> and our <a href="https://docs.knock.app/developer-tools/mcp-server">new MCP server</a>.</p>
<h2 id="user-content-knock-agent-toolkit"><a href="#knock-agent-toolkit" tabindex="-1"><span></span></a>Knock Agent Toolkit</h2>
<p>Agent Toolkit is a set of tools that enables your agents to send messaging across channels such as in-app, email, push, SMS, and chat apps (Slack, Microsoft Teams.) All messaging sent by the agent works within the guardrails of the messaging workflows and templates you configure in Knock.</p>
<pre><code class="language-javascript">const toolkit = await createAgentToolkit({
  permissions: {
    workflows: {
      trigger: ["comment-created", "task-completed", "welcome-user"],
    },
  },
});
</code></pre>
<h3 id="user-content-human-in-the-loop"><a href="#human-in-the-loop" tabindex="-1"><span></span></a>Human-in-the-loop</h3>
<p>An important part of building agents is enabling them to go to humans to provide input, verify work, and approve outputs. Agent Toolkit exposes <a href="https://docs.knock.app/developer-tools/agent-toolkit/human-in-the-loop-flows">a set of helper methods</a> that make it easy to wrap your tool calls in asynchronous human approvals or inputs.</p>
<pre><code class="language-javascript">import { createToolkit } from "@knocklabs/agent-toolkit/ai-sdk";

const toolkit = createToolkit();

const classifyToolRequiringInput = toolkit.requireHumanInput(classifyWork, {
  workflow: "approve-classification",
  recipients: ["user_123"],
});
</code></pre>
<p>Our toolkit comes with built-in support for major agent frameworks and SDKs including Vercel AI SDK, LangChain, and OpenAI.</p>
<h2 id="user-content-knock-mcp-server"><a href="#knock-mcp-server" tabindex="-1"><span></span></a>Knock MCP server</h2>
<p>Anything you can do in the Knock dashboard you can now do using natural language.</p>
<p>We’re shipping a local MCP server that wraps Agent Toolkit and exposes the tools via the Model Context Protocol. The MCP server can be installed in any MCP-compatible client, including AI coding tools such as Cursor, Windsurf, or Claude Code.</p>
<p>We’re giving foundation models and tools like Cursor the ability to set up workflows, design emails, interact with Knock observability data, and much more.</p>
<h2 id="user-content-get-started"><a href="#get-started" tabindex="-1"><span></span></a>Get started</h2>
<p>You can get started today with Agent Toolkit and our MCP server by reading <a href="https://docs.knock.app/developer-tools/agent-toolkit/overview">the documentation</a> and installing the package via npm (<code>@knocklabs/agent-toolkit</code>).</p>
<p>The future is agentic. At Knock we’re thrilled to get the opportunity to partner with our customers and define how agents and humans work together.</p>
<p>To learn more, read the <a href="https://knock.app/blog/announcing-agent-toolkit-and-mcp-server">full announcement</a>.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI generate workflow trigger data schemas]]></title>
            <description><![CDATA[We've shipped the ability to use AI to generate your workflow trigger data schema, and added a new commits tab to the workflows page.]]></description>
            <link>https://knock.app/changelog#2025-04-09</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-04-09</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 09 Apr 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're shipping the ability to use AI to generate workflow trigger data schemas, making it effortless to get started with verifying the data being passed to your Knock workflow trigger.</p>
<p><a href="/changelog/2024-09-05">Last year we shipped</a> our workflow <a href="https://docs.knock.app/developer-tools/validating-trigger-data">trigger data schema validation</a>, which allows you to use a JSON schema to describe the data that's expected as part of your workflow trigger. However, getting started here required you to write out a full JSON schema from scratch.</p>
<p>Now, using AI, you can click the "Generate schema" button to automatically generate a trigger data JSON schema from data available to your workflow. It's like magic.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 [Dashboard] We added a new "Commits" tab to the workflow page where you can see all commits on that workflow and promote changes.</li>
<li>👀 [SDKs] We now support a <code>containerStyle</code> prop for the React Native and Expo SDK's <code>NotificationFeed</code> component.</li>
<li>👀 [SDKs] <code>fetchNextPage</code> in the JavaScript SDK FeedClient now supports <code>FetchFeedOptions</code>.</li>
<li>🐛 [SDKs] Trigger data filtering now supports boolean values in the JavaScript and React SDK.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Filter commits by workflow]]></title>
            <description><![CDATA[We've added the ability to filter commits by workflow to help teams better track and manage changes across their notifications.]]></description>
            <link>https://knock.app/changelog#2025-04-02</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-04-02</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 02 Apr 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're introducing workflow filtering for our commits page. Users can now filter the commits page by workflow to help teams better track and manage changes across their notifications.</p>
<p>Commit log filtering is available for all users on the "Commits" page, within the "Commit log" and "Unpromoted" tabs. Select a workflow from the filter dropdown to see all commits related to that workflow.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 [Notification engine] We fixed an issue where MS Teams webhooks would unexpectedly retry a sent notification.</li>
<li>👀 [API] We added support for datetime filtering to the user feed endpoint.</li>
<li>👀 [API] We added support for listing recipients with their preference sets loaded.</li>
<li>👀 [Notification engine] We added support for a new <code>from_markdown</code> Liquid helper to convert Markdown to HTML.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New Commits Page]]></title>
            <description><![CDATA[We've redesigned our commits page to help teams better track and manage changes across their notification workflows.]]></description>
            <link>https://knock.app/changelog#2025-03-27</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-03-27</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 27 Mar 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're excited to announce a new design for our commits page.</p>
<p>Teams operating customer engagement at scale know the difficulty of managing multiple changes across several teams and channels. With all of the moving parts, it's easy to lose track of what's been changed and when.</p>
<p>Knock enables teams to collaborate effectively with a powerful commit and environment model. But we recently identified a need to enhance the commits page UI to be even more useful. That's why we've redesigned our commits page with a focus on clarity and usability, making it easier for growing teams to manage changes to their notifications.</p>
<p>The new design is available today to all users under the "Commits" tab in the sidebar.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 [Dashboard] We added support for the "markdown" Liquid filter to allow MarkDown input -> HTML conversion</li>
<li>👀 [Dashboard] Rolled out trigger event improvements</li>
<li>🐛 [Dashboard] We fixed an issue with Menu Buttons firing multiple times</li>
<li>🐛 [Dashboard] We deployed a fix for an email template rendering issue</li>
<li>🐛 [SDK] We addressed an issue in the Go SDK where some user properties were incorrectly marked as required</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React 19 Support]]></title>
            <description><![CDATA[We've added support for React 19 to our JavaScript SDKs.]]></description>
            <link>https://knock.app/changelog#2025-03-13</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-03-13</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 13 Mar 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-react-19-support-in-our-javascript-sdks"><a href="#react-19-support-in-our-javascript-sdks" tabindex="-1"><span></span></a>React 19 support in our JavaScript SDKs</h2>
<p>Today we're releasing support for React 19 in our web JavaScript SDKs. This will enable projects with React 19 as a dependency to use our SDKs without any additional configuration. Projects using React 18 or below can safely upgrade to the latest SDK versions without any code changes, as this update maintains full backwards compatibility. All code changes can be found in the <a href="https://github.com/knocklabs/javascript/pull/448">GitHub pull request here</a>.</p>
<p>To upgrade, set the package versions in your <code>package.json</code> to the latest version listed below, then reinstall.</p>
<p>Here are the latest versions of our SDKs:</p>
<ul>
<li><a href="https://github.com/knocklabs/javascript/releases/tag/%40knocklabs%2Fclient%400.12.0"><code>@knocklabs/client</code>: v0.12.0</a></li>
<li><a href="https://github.com/knocklabs/javascript/releases/tag/%40knocklabs%2Freact%400.6.0"><code>@knocklabs/react</code>: v0.6.0</a></li>
<li><a href="https://github.com/knocklabs/javascript/releases/tag/%40knocklabs%2Freact-core%400.5.0"><code>@knocklabs/react-core</code>: v0.5.0</a></li>
</ul>
<p>With these updates, our web SDKs now support React versions 16, 17, 18, and 19.</p>
<h3 id="user-content-a-note-on-the-react-native-and-expo-packages"><a href="#a-note-on-the-react-native-and-expo-packages" tabindex="-1"><span></span></a>A note on the react-native and expo packages:</h3>
<p>The <code>react-native</code> and <code>expo</code> packages do not yet support React 19.</p>
<p><a href="https://reactnative.dev/blog/2025/02/19/react-native-0.78">React 19 recently became available on React Native</a>, however, some of the internal dependencies need time to catch up and support these changes before we can update our own packages.</p>
<p>Since the underlying dependency on <code>@knocklabs/client</code> was updated, we released a new version for these packages as well.</p>
<ul>
<li><a href="https://github.com/knocklabs/javascript/releases/tag/%40knocklabs%2Freact-native%400.6.0"><code>@knocklabs/react-native</code>: v0.6.0</a></li>
<li><a href="https://github.com/knocklabs/javascript/releases/tag/%40knocklabs%2Fexpo%400.3.0"><code>@knocklabs/expo</code>: v0.3.0</a></li>
</ul>
<h2 id="user-content-react-19-support-in-our-telegraph-components"><a href="#react-19-support-in-our-telegraph-components" tabindex="-1"><span></span></a>React 19 support in our Telegraph components</h2>
<p>In addition to the JavaScript SDKs, we've also updated our <a href="https://github.com/knocklabs/telegraph">Telegraph components</a> to support React 19. As a dependency of our JavaScript SDKs, this means that you can now use our in-app notification components and hooks with React 19 without any additional configuration.</p>
<p><a href="https://docs.knock.app/sdks/react/overview">You can read more about using our React components to build in-app notifications in the docs here.</a></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 [Dashboard] We fixed a bug where users were able to create variables without setting a value</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Email-based user ID resolution for Slack]]></title>
            <description><![CDATA[We've added the ability to automatically resolve Slack user IDs using your Knock users' email addresses, simplifying the steps needed to send Slack DMs to your Knock users.]]></description>
            <link>https://knock.app/changelog#2025-03-11</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-03-11</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 11 Mar 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-email-based-user-id-resolution-for-slack"><a href="#email-based-user-id-resolution-for-slack" tabindex="-1"><span></span></a>Email-based user ID resolution for Slack</h2>
<p>Today we’re introducing email-based user ID resolution for Slack, simplifying the steps needed to send direct messages via Slack to your Knock users.</p>
<p>Previously, if you wanted to send a direct message via Slack to one of your users, you needed to update your Knock user’s channel data to include their Slack user ID. This ID is typically found by making a request to the <code>users.lookupByEmail</code> endpoint of the Slack API using your Knock user’s email address.</p>
<p>Now, Knock can automatically make this API request on your behalf before sending a message. When the request succeeds, Knock will automatically add the Slack user ID to the user’s channel data.</p>
<p>You can read more about enabling email-based user ID resolution for Slack in <a href="https://docs.knock.app/integrations/chat/slack/sending-a-direct-message#resolving-a-users-slack-id">our documentation</a>.</p>
<ul>
<li>👀 [Dashboard] We made it possible to see who created a workflow, in addition to who last edited a workflow.</li>
<li>🐛 [Notification engine] We fixed a bug in which temporary failures from Mailgun were treated as undelivered.</li>
<li>🐛 [Dashboard] We fixed a bug in which a cloned workflow would default to the inactive state.</li>
<li>👀 [SDK] We updated our SDKs to include <code>ending_at</code> for scheduled workflows.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Filter messages by workflow run ID]]></title>
            <description><![CDATA[We've added the ability to filter messages by workflow run ID in the API and dashboard.]]></description>
            <link>https://knock.app/changelog#2025-02-26</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-02-26</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 26 Feb 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-filter-messages-by-workflow-run-id"><a href="#filter-messages-by-workflow-run-id" tabindex="-1"><span></span></a>Filter messages by workflow run ID</h2>
<p>Today we're introducing the ability to filter for messages by a workflow run ID or a workflow recipient run ID.</p>
<p>Before, if you wanted to find all of the messages produced for a single workflow trigger call you needed to attach your own identifier to your messages and use our trigger data filtering. Now, with our new filtering capabilities, you can filter for messages by the workflow run ID returned from a trigger request, or an individual workflow recipient run ID.</p>
<p>We've introduced these new filters into the <a href="https://docs.knock.app/reference#list-messages">messages API</a>, and also to the dashboard, making it easier than ever to track down specific messages produced from a single workflow run, or for multiple workflow runs from a single trigger request.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 [Notification engine] We fixed an issue with our SMTP sender where including a from name could cause some email providers to fail.</li>
<li>👀 [Dashboard] We added support for better surfacing inline errors in our code editor for Liquid, JSON, and Markdown.</li>
<li>👀 [Dashboard] We now show the total number of members in a workspace in the members list.</li>
<li>🐛 [Dashboard] We fixed an issue with our fetch step where in certain cases it could fail to send a test with a hard crash.</li>
<li>🐛 [Dashboard] We added support for being able to use message conditions on push notification steps.</li>
<li>🐛 [Dashboard] We fixed a small bug where descriptions longer than 255 characters for variables would fail to save.</li>
<li>🐛 [Dashboard] We fixed a minor issue with our commit log viewer where long lines were not wrapping.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing per-recipient workflow trigger data]]></title>
            <description><![CDATA[We've added the ability to supply per-recipient trigger data in your workflow triggers, making it easier than ever to personalize the data you use in your workflow templates.]]></description>
            <link>https://knock.app/changelog#2025-02-05</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-02-05</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 05 Feb 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-per-recipient-workflow-trigger-data"><a href="#per-recipient-workflow-trigger-data" tabindex="-1"><span></span></a>Per-recipient workflow trigger data</h2>
<p>Today we're releasing an extension to our <a href="https://docs.knock.app/send-notifications/triggering-workflows/api">workflow trigger API</a>: the ability to supply per-recipient trigger data. Previously, the <code>data</code> field supplied to your workflow trigger was shared across all recipients, meaning that if you wanted to supply recipient-specific data, you had to do so by either triggering a workflow per-recipient, or by stuffing data onto the user's profile.</p>
<p>Now, with the introduction of per-recipient trigger data, you can supply recipient-specific trigger data for up to 1000 recipients at a time via the workflow trigger API. The per-recipient trigger data will be merged onto the base workflow trigger data, making it easy to still supply shared data to all recipients of your workflow while providing anything recipient-specific.</p>
<p>Here's an example, where we're supplying a recipient-specific dashboard URL to the workflow. In this example, when the workflow runs for <code>esattler</code>, it will merge the contents of their trigger data onto the base <code>data</code>, so the <code>dashboard_url</code> will be <code>https://dashboard.jurassic.park/esattler</code>.</p>
<pre><code class="language-typescript">{
  "data": {
    "dashboard_url": "https://dashboard.jurassic.park",
    "alert_type": "dinos-roaming",
    "alert_id": "1234567890"
  },
  "recipients": [
    {
      "id": "esattler",
      "$trigger_data": {
        "dashboard_url": "https://dashboard.jurassic.park/esattler"
      }
    }
  ]
}
</code></pre>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 [API] We fixed an issue where the user deletion API could sometimes respond with an inconsistent status code.</li>
<li>🐛 [SDK] We fixed an issue where the Python SDK would not correctly handle JSON errors from particular versions of the <code>requests</code> library.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Programmatically preview workflow templates]]></title>
            <description><![CDATA[We've added a new endpoint to the Knock Management API to generate previews of workflow templates.]]></description>
            <link>https://knock.app/changelog#2025-01-30</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-01-30</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 30 Jan 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we're releasing TeamsKit, a suite of embeddable UIs and APIs that lets you connect your product to customers' Teams instances and send notifications to where they work.</p>
<p>Behind the scenes, TeamsKit:</p>
<ul>
<li>manages your OAuth connection and tokens.</li>
<li>helps your customers select which channels they will receive notifications in.</li>
<li>integrates seamlessly with the rest of Knock, so you can easily send notifications to Teams alongside any other channel.</li>
</ul>
<p>Shipping a Teams integration has never been easier.</p>
<p><a href="/blog/announcing-teamskit">Read the full announcement -></a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Schedule workflows until a specific date]]></title>
            <description><![CDATA[We've added a new field to the Schedules endpoint to allow you to schedule a workflow to repeat until a specific date.]]></description>
            <link>https://knock.app/changelog#2025-01-29</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-01-29</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 29 Jan 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-schedule-workflows-until-a-specific-date"><a href="#schedule-workflows-until-a-specific-date" tabindex="-1"><span></span></a>Schedule workflows until a specific date</h2>
<p>As a nice quality of life improvement, we've added a new <code>ending_at</code> field to <a href="https://docs.knock.app/concepts/schedules">Schedules</a>. The ending at field allows you to schedule a workflow to repeat for a recipient until a specific date, making it easy to build schedules that run for a limited time.</p>
<p>You can read more about scheduling workflows with an ending date in <a href="https://docs.knock.app/concepts/schedules#frequently-asked-questions">our documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 [Dashboard] We added support for setting an empty layout for email templates in a workflow.</li>
<li>👀 [mAPI] We added support for a null <code>layout_key</code> for email templates in a workflow.</li>
<li>🐛 [Dashboard] We fixed an issue where previewing an email template with an invalid set of JSON overrides would fail.</li>
<li>🐛 [Dashboard] We fixed an issue where changing a step title or description would not save correctly when typing quickly.</li>
<li>🐛 [Dashboard] We fixed an issue where partials could not be used when they use system key names like <code>primary-button</code>.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Programmatically preview workflow templates]]></title>
            <description><![CDATA[We've added a new endpoint to the Knock Management API to generate previews of workflow templates.]]></description>
            <link>https://knock.app/changelog#2025-01-16</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-01-16</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 16 Jan 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-programmatically-preview-workflow-templates"><a href="#programmatically-preview-workflow-templates" tabindex="-1"><span></span></a>Programmatically preview workflow templates</h2>
<p>We've added a new endpoint to the <a href="https://docs.knock.app/developer-tools/management-api">Knock Management API</a> to preview workflow templates. This is useful if you're looking to integrate Knock into your own application and need a way to preview templates with user supplied data, like when building a template customization experience.</p>
<p>To use the preview endpoint, you pass it a channel step on a workflow, and provide the <code>recipient</code>, <code>actor</code>, <code>tenant</code>, and <code>data</code> parameters to render the template with. The API will then return a JSON object with the rendered template across all channel types, or a detailed error response if the template could not be rendered.</p>
<p>You can read more about the preview endpoint in <a href="https://docs.knock.app/mapi#workflows-preview-template">our documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 [Dashboard] We added pagination to the source events list.</li>
<li>🐛 [Dashboard] We fixed an issue where the "Previous" button on user, object, and tenants lists would always return you to the first page.</li>
<li>🐛 [Dashboard] We fixed an issue where the count at the bottom of some table views would always only show the number of items returned on that page, not the total number of items.</li>
<li>🐛 [Dashboard] We fixed an issue where creating a workflow from a template with a category would fail.</li>
<li>🐛 [Notification engine] We fixed an issue where SMS links over 255 characters would not be shortened.</li>
<li>🐛 [API] We fixed an issue with paginating users, objects, and tenants with a <code>before</code> cursor.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Override the recipient of an SMS"]]></title>
            <description><![CDATA[We've added support for overriding the recipient of an SMS message.]]></description>
            <link>https://knock.app/changelog#2025-01-09</link>
            <guid isPermaLink="false">https://knock.app/changelog#2025-01-09</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 09 Jan 2025 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-sms-recipient-override"><a href="#sms-recipient-override" tabindex="-1"><span></span></a>SMS recipient override</h2>
<p>Today we're announcing support for overriding the recipient of an SMS message. This is useful if you want to send an SMS to a different user than the one that triggered the workflow.</p>
<p>With the new SMS recipient override, you can now specify either a static or dynamic value via Liquid for the recipient of an SMS. For example, you might be sending an SMS to the user, but be sending it to the new phone number they entered and stored on the recipient profile as <code>recipient.new_phone_number</code>.</p>
<p>You can read more about SMS overrides in <a href="https://docs.knock.app/integrations/sms/settings-and-overrides">our documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 [Dashboard] You can now see <code>environment.merged_latest</code> changes in the audit logs.</li>
<li>🐛 [API] We fixed an issue where hourly schedules with an interval > 1 would be enqueued at the wrong time.</li>
<li>🐛 [Dashboard] We fixed an issue where the workflow builder would show an incorrect tooltip when adding steps.</li>
<li>🐛 [Dashboard] We fixed an issue where after adding an integration, you would need to refresh the page to see it show up in the workflow builder.</li>
<li>🐛 [SDK] You can now safely mount the <code>&#x3C;KnockProvider></code> in the React SDK with a null or undefined userId.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Template references]]></title>
            <description><![CDATA[We've added support for referencing dynamic data in templates.]]></description>
            <link>https://knock.app/changelog#2024-12-13</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-12-13</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 13 Dec 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-reference-dynamic-object-user-and-tenant-data-in-templates"><a href="#reference-dynamic-object-user-and-tenant-data-in-templates" tabindex="-1"><span></span></a>Reference dynamic object, user, and tenant data in templates</h2>
<p>Today we're announcing support for referencing objects, users, and tenants dynamically in templates. While we've always exposed properties on the template such as the <code>recipient</code>, <code>actor</code>, and <code>tenant</code>, if you needed to reference other object or user data stored within your Knock environment, you had no access to that within your workflow scope.</p>
<p>Now, with template references, you can load arbitrary objects, users, and tenants into your template context. This allows you to reference any data stored within your Knock environment, such as a different user's profile, a tenant's settings, or an object's properties. Using template references brings access to any kind of third-party object data that you might want to store in Knock, without needing to pass it into your workflow data.</p>
<p>Here's an example. Let's say you're a collaboration product, and you want to show the current project's most up to date title and description in an update email for things happening on that project. With template references, you can load the project object dynamically at execution time by passing in a <code>project_id</code> into your workflow trigger, and then loading the project object into your template context.</p>
<pre><code class="language-liquid">{% assign project = data.project_id | object: "projects" %}

# {{ project.title }}: new updates

> {{ project.description }}

There have been {{ total_activities }} updates on this project in the last 24 hours.
</code></pre>
<p>This feature is available now to all Knock customers. You can read more about the feature in our <a href="https://docs.knock.app/designing-workflows/template-editor/referencing-data">template references documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed an issue with the workflow canvas where it would no longer center correctly.</li>
<li>🐛 We fixed an issue with channel steps in the workflow builder, where it appeared you could change the selected channel in non-development environments.</li>
<li>🐛 We fixed an issue where cleaning up message history on the deletion of a user would sometimes fail.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Override the recipient of an email]]></title>
            <description><![CDATA[We've added support for overriding the recipient of an email generated in Knock.]]></description>
            <link>https://knock.app/changelog#2024-12-04</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-12-04</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 04 Dec 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-override-the-recipient-of-an-email"><a href="#override-the-recipient-of-an-email" tabindex="-1"><span></span></a>Override the recipient of an email</h2>
<p>Today we're adding support for overriding the recipient of an email generated in Knock. Previously, emails were always sent to the email address associated with the recipient.</p>
<p>With the new to email override, you can now specify either a static or dynamic value via liquid for the recipient of an email. For example, you might be sending a change email confirmation to the user, but be sending it to the new email address they entered and stored on the recipient profile as <code>recipient.new_email</code>.</p>
<p>You can read more about the feature in our <a href="https://docs.knock.app/integrations/email/settings#overriding-the-default-to-address">email overrides documentation</a>.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Immediately flush the first item in a batch]]></title>
            <description><![CDATA[We've added support for immediately flushing the first item in the batch step.]]></description>
            <link>https://knock.app/changelog#2024-11-26</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-11-26</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 26 Nov 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-immediately-flush-the-first-item-in-a-batch"><a href="#immediately-flush-the-first-item-in-a-batch" tabindex="-1"><span></span></a>Immediately flush the first item in a batch</h2>
<p>Today we're excited to extend our batch step with support for immediately flushing the first item in the batch. Previously, our batch step would collect all triggers across the batch window, and flush those as a single batch once the window closed.</p>
<p>With immediate flushing, your batch will always flush the first item before accumulating subsequent triggers across the batch window. If you're a developer, you might be familiar with this concept as a "leading debounce". This can be useful when you want to immediately notify your users about some action occurring, while still batching any additional information across a window of time to reduce the number of notifications your users receive.</p>
<p>You'll find the option to immediately flush the first item in the batch under the advanced options in the batch step settings. You can read more about the feature in our <a href="https://docs.knock.app/designing-workflows/batch-function#immediately-flushing-the-first-item-in-a-batch">batch step documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added support for sending multiple tags to Mailgun via overrides.</li>
<li>🐛 We moved our OneSignal integration to use the v11.6 API.</li>
<li>🐛 We added a <code>role="none"</code> attribute to any open tracking pixels included in emails.</li>
<li>🐛 We fixed an issue where identify events sent to Segment would override properties set on the user being identified.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing bot framework support for Microsoft Teams]]></title>
            <description><![CDATA[We've extended our Microsoft Teams integration to support sending via bots through the Bot Framework.]]></description>
            <link>https://knock.app/changelog#2024-11-21</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-11-21</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 21 Nov 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-bot-framework-support-for-microsoft-teams"><a href="#bot-framework-support-for-microsoft-teams" tabindex="-1"><span></span></a>Bot framework support for Microsoft Teams</h2>
<p>Today we're excited to announce that we've added support to our Microsoft Teams integration for sending notifications via bots through the <a href="https://dev.botframework.com/">Microsoft Bot Framework</a>. While we've previously had support for Microsoft Teams as a provider in Knock, our integration only supported sending via webhooks, which was most suitable for internal or one-off use cases.</p>
<p>Using the Bot Framework, we can now support multi-tenant integrations that can send messages to channels and directly to users, making it possible to build richer notification experiences on top of Microsoft Teams and powered directly through Knock.</p>
<p>You can read more in our refreshed <a href="https://docs.knock.app/integrations/chat/microsoft-teams/overview">Microsoft Teams documentation</a> on how to get started.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We've added inline step editing to the workflow builder for the step name, description, and reference fields.</li>
<li>👀 We added support for navigating the workflow builder using the keyboard. You can now use the arrow keys to easily select different steps and navigate your workflows.</li>
<li>🐛 We fixed a bug where long workflow keys would wrap in the workflow list.</li>
<li>🐛 We fixed an issue where email template setting overrides were not being saved because of invalid override JSON being provided.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing Knock in-app message types]]></title>
            <description><![CDATA[Create specific types of in-app messages and map them to components in your application.]]></description>
            <link>https://knock.app/changelog#2024-11-14</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-11-14</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 14 Nov 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-introducing-in-app-message-types"><a href="#introducing-in-app-message-types" tabindex="-1"><span></span></a>Introducing in-app message types</h2>
<p>Today we're excited to announce the beta release of in-app message types. Building on our <a href="/changelog/2024-11-13">in-app messaging components release</a>, with today's release you can now power <strong>any UI element</strong> in your product—a banner, a carousel, a tag, anything—using Knock's workflow engine and real-time messaging infrastructure. Here's how it works.</p>
<p>In-app message types enable you to map UI elements and components from your application to a message type in Knock. Once you've created a message type, you can use it to target and send native messages to that component in your own product, powered by Knock's real-time messaging infrastructure.</p>
<p>In-app message types are a powerful way for your engineering team to own the structure and implementation of in-app messages displayed to your users, while giving product managers and marketers the flexibility to create and manage the in-app messages sent to your users through Knock's powerful visual workflow builder.</p>
<p>Each in-app message type has a schema that determines the fields available to your content editors when building a new in-app message. Schemas are versioned and can be updated over time to create <strong>strong guarantees</strong> between the structure expected in your components and the messages exposed over the API.</p>
<p>To render components for a given message type, you use our React SDK and hooks to fetch any messages of that type for the current user. Knock owns the data layer, while your team owns the component, making it possible to create <strong>native in-app messaging</strong> that leverages your existing design system and component library. This also means that native in-app messaging powered with Knock is just as performant as the rest of your app, and won't be blocked by ad blockers. You can read more and see examples in <a href="https://docs.knock.app/in-app-ui/message-types">the documentation</a>.</p>
<p>In-app message types are currently in beta. If you're interested in trying them out, please <a href="mailto:support@knock.app?subject=In-app%20message%20types%20beta">contact our team</a>.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing Knock in-app messaging components]]></title>
            <description><![CDATA[We've added a new set of in-app messaging components to our React SDK to help you power even more types of in-app experiences.]]></description>
            <link>https://knock.app/changelog#2024-11-13</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-11-13</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 13 Nov 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-introducing-knock-in-app-messaging-components"><a href="#introducing-knock-in-app-messaging-components" tabindex="-1"><span></span></a>Introducing Knock in-app messaging components</h2>
<p>Today we're excited to announce the launch of a new set of in-app messaging components for our React SDK, making it possible to power a new set of in-app experiences with Knock.</p>
<p>Previously, our in-app SDK was limited to powering feed and inbox experiences, and used to integrate our SlackKit components into your application. Now with today's release, you can use our new <code>&#x3C;Modal /></code>, <code>&#x3C;Banner /></code>, and <code>&#x3C;Card /></code> components to build out a new set of in-app experiences for your users, all powered by Knock's real-time messaging infrastructure, and seamlessly integrated into our workflow builder.</p>
<p>Our in-app components enable your content editors to create and manage in-app messages directly within Knock's workflow builder as part of a cross-channel messaging strategy. Because in-app messages are just another channel in Knock, you can create them as part of a workflow powered by events, or even when your users <a href="https://docs.knock.app/concepts/audiences">enter an audience</a>. That means you can build experiences like:</p>
<ul>
<li><strong>Welcome messages</strong>: show a modal when a user signs up for your product.</li>
<li><strong>Overage banners</strong>: when a user exceeds some usage threshold on their account, show a banner to let them know.</li>
<li><strong>Upsell cards</strong>: show a persistent message within your product to upsell your users on additional features once they've onboarded.</li>
</ul>
<p>Each of our out-of-the-box components are fully customizable, with the ability to override the CSS variables or classes associated with each component. Or you can even build your own components on top of our data layer via our hooks, making it easy to integrate Knock's messaging into your existing design system or component library.</p>
<p>Here's a quick look at rendering one of our components to show a banner at the top of your product:</p>
<pre><code class="language-tsx">import {
  Banner,
  KnockProvider,
  KnockInAppMessagesChannelProvider,
} from "@knocklabs/react";

const MyApplication = () => {
  const { user } = useCurrentUser();

  return (
    &#x3C;MyLayout>
      &#x3C;KnockProvider apiKey={process.env.KNOCK_API_KEY} userId={user.id}>
        &#x3C;KnockInAppMessagesChannelProvider
          channelId={process.env.KNOCK_IAM_CHANNEL_ID}
        >
          &#x3C;Banner />
          &#x3C;MyHeader />
          &#x3C;MyFooter />
        &#x3C;/KnockInAppMessagesChannelProvider>
      &#x3C;/KnockProvider>
    &#x3C;/MyLayout>
  );
};
</code></pre>
<p>Our in-app components are currently in private beta. If you'd like to be added to the beta experience, please <a href="mailto:support@knock.app">reach out to our support team</a>. You can read more about the components in our <a href="https://docs.knock.app/in-app-ui/react/messaging-components">documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We made some visual updates to the look and feel of the workflow builder, including a new improved panels architecture.</li>
<li>🐛 We fixed an issue with saving step metadata in the workflow builder.</li>
<li>🐛 We fixed a bug with the branch step in the workflow builder that was hiding a maximum depth reached error.</li>
<li>🐛 We fixed an issue with some modals that meant they were overflowing unexpectedly.</li>
<li>🐛 We fixed an issue with viewing commits and committing workflow changes on the commits page.</li>
<li>🐛 We fixed a bug where computed delay windows were showing the incorrect value in workflow run logs.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SMTP email provider support]]></title>
            <description><![CDATA[We've added the ability to send emails via SMTP.]]></description>
            <link>https://knock.app/changelog#2024-10-29</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-10-29</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 29 Oct 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-smtp-email-provider-support"><a href="#smtp-email-provider-support" tabindex="-1"><span></span></a>SMTP email provider support</h2>
<p>We've added support for sending emails via SMTP through Knock. Our SMTP provider allows you to send emails through any SMTP server, giving you the flexibility to use your existing email infrastructure with Knock.</p>
<p>You can get started by configuring your SMTP provider in the "Integrations > Channels" page in the Knock dashboard. You can read more about the SMTP channel in our <a href="https://docs.knock.app/integrations/email/smtp">documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We've added support for using <code>recipient.preferences</code> as part of the workflow run scope. You can now target any property on recipient preference set within template variables and conditions</li>
<li>🐛 We fixed an issue where overrides for branding and logos were not showing the base versions within the dashboard</li>
<li>🐛 We fixed an issue that was preventing trigger conditions from being saved in certain cases</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing Audiences in Knock]]></title>
            <description><![CDATA[Today we're releasing our Audiences beta, bringing the concept of user segmentation into Knock.]]></description>
            <link>https://knock.app/changelog#2024-10-24</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-10-24</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 24 Oct 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-introducing-audiences"><a href="#introducing-audiences" tabindex="-1"><span></span></a>Introducing Audiences</h2>
<p>Today we’re excited to announce a new way to power your notification workflows: Knock Audiences. Audiences bring the concept of user segmentation into Knock.</p>
<p>An audience represents a list of users you define who all share a common set of characteristics. You can build any number of segments of users that you'd like, bring those audiences into Knock, and then use them to power notification behavior.</p>
<p>With this release, you can bring audiences into Knock programmatically through our new Audiences API and direct integrations with reverse ETL tools like <a href="https://www.hightouch.com/">Hightouch</a> and <a href="https://www.getcensus.com/">Census</a>. Your audiences are then available to view and manage through the Knock dashboard.</p>
<p>Once you start creating audiences in Knock, you can use them to:</p>
<ul>
<li>Trigger workflows when new users are added to an audience. This is great for powering lifecycle messaging (such as new user signups) and transactional messaging (such as payment method updates) use cases</li>
<li>Orchestrate branch and conditional logic within your workflows (e.g. if a user is in <code>paid-users</code> audience, opt them out of the workflow)</li>
</ul>
<p>With today's release, we’re excited to expand the messaging use cases you can power with Knock and help our customers power a unified messaging motion across their product and lifecycle marketing.</p>
<p>Audiences are <strong>currently in beta</strong>. If you want to try them out, <a href="mailto:support@knock.com?subject=Audience%20Beta%20Access">you can contact our team</a> to request access. To learn more about what's possible with audiences, check out <a href="https://docs.knock.app/concepts/audiences">our documentation</a>.</p>
<p>There's a lot more to come with Audiences in the future. They will form a pivotal building block for new features we're working on over the coming months, and we can't wait to share more with you soon.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed an issue with translations where archiving a namespaced translation would cause other translations for that locale to stop working when previewing and sending</li>
<li>🐛 We fixed an issue where using liquid in a JSON editor would sometimes cause the validation to fail</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Our new Expo SDK]]></title>
            <description><![CDATA[We've released a new Expo specific version of our React Native SDK, to better integrate with the Expo ecosystem.]]></description>
            <link>https://knock.app/changelog#2024-10-22</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-10-22</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 22 Oct 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-expo-sdk-and-react-native-sdk-updates"><a href="#expo-sdk-and-react-native-sdk-updates" tabindex="-1"><span></span></a>Expo SDK and React Native SDK updates</h2>
<p>Today we've released a new <code>@knocklabs/expo</code> SDK that includes support for mobile and web applications built using the Expo framework. This SDK includes a new <code>KnockExpoPushNotificationProvider</code> component that streamlines the integration with Expo push notifications, helping you to quickly get up and running with push notifications powered by Knock and Expo.</p>
<p>We've also released a new version of our existing <code>@knocklabs/react-native</code> SDK that includes a new <code>KnockPushNotificationProvider</code> that exposes <code>registerPushTokenToChannel</code> and <code>unregisterPushTokenFromChannel</code> methods to support push notification token registration outside of the Expo ecosystem. You can see these in use in our <a href="https://github.com/knocklabs/javascript/tree/main/examples/react-native-example">new React Native example app</a>, where we're integrating with Firebase messaging.</p>
<p>To get started with the Expo SDK, check out <a href="https://docs.knock.app/sdks/expo/overview">the documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed a bug where the test runner could not be accessed in non-development environments</li>
<li>🐛 We fixed an issue with adding email template overrides with liquid variables that resolve to JSON</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Workflow builder 3.0]]></title>
            <description><![CDATA[We've rebuilt the workflow builder from the ground up to be more powerful and flexible than ever before.]]></description>
            <link>https://knock.app/changelog#2024-10-17</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-10-17</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 17 Oct 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-workflow-builder-30"><a href="#workflow-builder-30" tabindex="-1"><span></span></a>Workflow builder 3.0</h2>
<p>The workflow builder is the visual interface for designing workflows in the Knock dashboard. It allows you to express complex cross-channel notification logic in an easy to reason about way.</p>
<p>After months of development, we're excited to announce a rebuild of the workflow builder with a new architecture, improved performance, and a more intuitive user experience. We've poured a lot of love into this update, and we're excited to share it with you today.</p>
<p>Here are a few of the key differences in the new workflow builder:</p>
<ul>
<li>🚀 <strong>Performance</strong>: The new workflow builder has been rebuilt from the ground up with a focus on performance. You'll notice that actions like adding and removing steps now feel instant, making it a delight to use.</li>
<li>🧩 <strong>Refreshed design</strong>: We've updated the visual style of the workflow builder to use our Telegraph design system. This includes a new color palette, typography, and iconography.</li>
<li>💪 <strong>Simplified step editing</strong>: Each step panel in the workflow builder has been rebuilt from the ground up to be more intuitive and easier to use.</li>
<li>😵‍💫 <strong>Goodbye spinners</strong>: We've removed virtually all of the loading spinners from the workflow builder as a result of our new architecture, making actions feel more responsive.</li>
</ul>
<p>Our goal at Knock is to build a powerful product that feels delightful to use, and we're confident that with our new workflow builder foundation, we're well on our way to achieving that goal. We will be making more improvements in the coming weeks, and you'll see us start to roll out these changes to the template editor next as well.</p>
<p>Stay tuned for more updates in the coming weeks, and we'd love to hear your feedback in the meantime.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed a bug where the test runner could not be accessed in non-development environments</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Relative delay windows]]></title>
            <description><![CDATA[You can now delay for a relative amount of time in our delay step.]]></description>
            <link>https://knock.app/changelog#2024-10-16</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-10-16</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 16 Oct 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-relative-delay-windows"><a href="#relative-delay-windows" tabindex="-1"><span></span></a>Relative delay windows</h2>
<p>Our delay step allows your workflow runs to pause for a certain amount of time before continuing, which is useful for scheduling reminders or other longer lived notifications. Previously, delay windows supported either a fixed amount of time (e.g. 30 minutes) or a dynamic value based on a property available in the workflow run scope.</p>
<p>Now with relative delay windows, you can specify a delay that is relative to a dynamic value provided, such as "30 minutes before the task is due" or "2 days after the task is created".</p>
<p>Relative delay windows are available now under the delay step in the workflow editor. You can get started by <a href="https://docs.knock.app/designing-workflows/delay-function#wait-until-a-relative-timestamp">reading the documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We've visually refreshed the date time comparison component in the dashboard to better understand a timestamp relative to the current user's timezone</li>
<li>👀 We've introduced a new search button to workflows, partials, and users to more easily find an item in the dashboard</li>
<li>🐛 We fixed an issue where certain pages on the dashboard would break out of their parent scroll container, causing the entire page to scroll</li>
<li>🐛 We fixed an issue where a member role could not upload tenant logos</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Get access to your user and preference data in your warehouse]]></title>
            <description><![CDATA[It's now possible to receive a stream of user changes into your data warehouse, amongst other small fixes and improvements.]]></description>
            <link>https://knock.app/changelog#2024-09-23</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-09-23</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Mon, 23 Sep 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-user-and-preference-data-now-available-in-your-warehouse"><a href="#user-and-preference-data-now-available-in-your-warehouse" tabindex="-1"><span></span></a>User and preference data, now available in your warehouse</h2>
<p>At Knock, we're always looking for more opportunities to give you access to the data that's available within your Knock account so that you can analyze it along with the rest of your product usage data.</p>
<p>With today's release, you can now receive a stream of user and preferences changes directly into your data warehouse. This makes it easy to build models that analyze your notification opt-out rates and how user profile information in Knock changes over time.</p>
<p>This feature is available to Enterprise customers who have set up a data warehouse sync. <a href="https://docs.knock.app/integrations/extensions/data-sync#recipient-change-stream-table">Read our documentation</a> to learn more.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We've moved trigger data into the <code>data</code> property in the template editor, so you now access properties as <code>{{ data.property_name }}</code></li>
<li>👀 We added a link to the billing portal for all customers to see their current daily usage quotas</li>
<li>👀 We added support for <code>base_logo_url</code> and <code>base_icon_url</code> when applying tenant branding so that the original branding properties can still be referenced</li>
<li>🐛 We removed support from our editor for unsupported liquid tags like <code>date_to_string</code></li>
<li>🐛 We fixed an issue where creating a new HTML partial would not immediately appear in the blocks sidebar</li>
<li>🐛 We fixed an issue where committing a change to a partial would not be reflected in the workflows and templates that use it</li>
<li>🐛 We fixed an issue where the <code>member</code> role in the account could not upload tenant branding</li>
<li>🐛 We fixed an issue with our <code>RadioCard</code> component to ensure the selected state is reflected correctly</li>
<li>🐛 We fixed an issue where passing <code>created_at</code> to Segment identifies could cause an error</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing workflow trigger data validation]]></title>
            <description><![CDATA[Validate the shape and types of the trigger data for your workflows.]]></description>
            <link>https://knock.app/changelog#2024-09-05</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-09-05</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 05 Sep 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-validating-workflow-trigger-data"><a href="#validating-workflow-trigger-data" tabindex="-1"><span></span></a>Validating workflow trigger data</h2>
<p>The data you pass into your Knock workflows is essential to ensure your notifications have the right content and context. Previously, if you omitted a value or passed through the wrong type of data into your workflow triggers, you could lead to malformed or incorrect notifications. Given how critical this data is, we're rolling out the ability to validate the incoming data for your workflow trigger by providing a JSON schema that describes the expected data.</p>
<p>When provided, if the data does not match the schema the workflow trigger API will return a <code>422 Unprocessable Entity</code> response with a list of errors. This ensures that your workflows are not run should incorrect data be provided.</p>
<p>You can configure a validation schema for your workflow trigger under the "Trigger step" in the workflow builder. It's also possible to supply the workflow trigger schema via our management API and CLI via the <code>trigger_data_json_schema</code> field.</p>
<p>Trigger data validation is available today to all Knock customers. <a href="https://docs.knock.app/developer-tools/validating-trigger-data">Read our documentation</a> to learn more about how this feature works.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added support for MessageMedia as a new SMS provider</li>
<li>👀 We added support for event idempotency through source events (<a href="https://docs.knock.app/integrations/sources/overview#event-idempotency">docs</a>)</li>
<li>👀 We now expose <code>url</code> and any message interaction data to Segment and Heap for link click and interacted events respectively</li>
<li>🐛 We fixed an issue where saving and committing a partial would not update the underlying schema</li>
<li>🐛 We fixed an issue where some JSON editors would not scroll correctly</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing Partials]]></title>
            <description><![CDATA[Reuse content across templates]]></description>
            <link>https://knock.app/changelog#2024-08-14</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-08-14</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 14 Aug 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h3 id="user-content-reuse-content-across-templates-with-partials"><a href="#reuse-content-across-templates-with-partials" tabindex="-1"><span></span></a>Reuse content across templates with Partials</h3>
<p>Today we’re releasing support for Partials, a new way to author pieces of content for reuse across templates. Partials are independently updated, versioned, and archived, and can be managed programmatically with the Knock CLI and management API.</p>
<p>Partials are now available to all customers. <a href="https://docs.knock.app/designing-workflows/partials">Read our documentation</a> to learn more about how this feature works.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We've made some UI and UX improvements to the workflow list and show pages in the dashboard</li>
<li>👀 We've improved the pagination of the workflow list in the dashboard. Paginating will now update the URL, so that refreshing the page or going back will take you to the correct page</li>
<li>👀 We added a keyboard shortcut to save translations (cmd + enter)</li>
<li>👀 We added new autocomplete suggestions for liquid tags in the template editor. Now when you type <code>{%</code> you'll see suggestions for common tags like <code>assign</code>, <code>if</code>, <code>for</code>, etc</li>
<li>🐛 We fixed a performance issue when typing in the create workflow modal</li>
<li>🐛 We fixed an issue where the billing page could be cut off at certain screen sizes</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing workflow trigger frequency]]></title>
            <description><![CDATA[Trigger a workflow once, and never again.]]></description>
            <link>https://knock.app/changelog#2024-08-07</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-08-07</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 07 Aug 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h3 id="user-content-trigger-workflows-only-once-per-recipient"><a href="#trigger-workflows-only-once-per-recipient" tabindex="-1"><span></span></a>Trigger workflows only once per recipient</h3>
<p>Today we’re releasing support for configuring workflow trigger frequency. You can now set a workflow to only trigger once per recipient (user, object or tenant) and never again. When enabled, if a workflow is run more than once for the same recipient, we will not execute the workflow.</p>
<p>Workflow trigger frequency is now available to all customers. <a href="https://docs.knock.app/send-notifications/triggering-workflows#controlling-workflow-trigger-frequency">Read our documentation</a> to learn more about how this setting works.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added support for a timezone in the <code>date</code> filter in the template editor</li>
<li>👀 We improved the scroll behavior around the dashboard, so returning to pages will restore your previous scroll position</li>
<li>👀 We disabled the per-word highlighting in commit diffs to improve readability</li>
<li>🐛 We loosened the required Expo and React Native versions for our React Native SDKs</li>
<li>🐛 We improved the consistency of the <code>timezone</code> and <code>date</code> filters in the template editor between editing and previewing templates</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing one-step commit and promotion for workflows]]></title>
            <description><![CDATA[Commit and merge changes into your environment without leaving the workflow page.]]></description>
            <link>https://knock.app/changelog#2024-08-01</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-08-01</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 01 Aug 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h3 id="user-content-commit-and-promote-from-a-workflow"><a href="#commit-and-promote-from-a-workflow" tabindex="-1"><span></span></a>Commit and promote from a workflow</h3>
<p>We've introduced a new way to commit and promote a workflow simultaneously right from the workflows page in your development environment. This feature streamlines the process of committing your changes and promoting them to the next environment without having to jump to the commits page. You can access this feature from any workflow page in the Knock dashboard.</p>
<h2 id="user-content-fixes"><a href="#fixes" tabindex="-1"><span></span></a>Fixes</h2>
<ul>
<li>🐛 We fixed an issue where an event sent from Segment could still trigger an archived workflow</li>
<li>🐛 We fixed an issue where newlines in the code editor weren't working</li>
<li>🐛 We fixed an issue where send windows weren't working for a webhook channel step</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A new response key for fetch steps, subscriptions for tenants in the dashboard, and more]]></title>
            <description><![CDATA[We added a host of fixes and improvements to Knock]]></description>
            <link>https://knock.app/changelog#2024-07-19</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-07-19</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 19 Jul 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added the ability for you to specify a response key in your fetch steps, which controls where the response gets placed in your workflow run data</li>
<li>👀 You can now see any subscriptions you have under a tenant via the dashboard</li>
<li>👀 We updated the Workflow creation modal to include category selection and improved the manage modal experience</li>
<li>👀 We moved the security settings into its own tab in the settings section of the dashboard</li>
<li>👀 We added the ability to filter analytics by bounced messages in the dashboard</li>
<li>🐛 We fixed an issue where our custom webhook channel would send an empty body on GET requests</li>
<li>🐛 We fixed an issue where E.164 phone numbers were not always being validated correctly, causing issues when saving Twilio provider configuration</li>
<li>🐛 We fixed an issue that caused schedules to not be created when an account timezone was not set</li>
<li>🐛 We fixed an issue that could cause invalid FCM project IDs because of extra whitespace</li>
<li>🐛 We fixed an issue with the schedules API that would not allow a <code>null</code> repeats value when <code>scheduled_at</code> was specified</li>
<li>🐛 We fixed an issue with our Sendgrid sender that would specify the wrong content type parameter for an attachment</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Out of the box in-app feed components for iOS and Android]]></title>
            <description><![CDATA[Easily build in-app feed experiences with our new pre-built components for iOS and Android. Plus, a bunch of fixes and improvements.]]></description>
            <link>https://knock.app/changelog#2024-06-27</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-06-27</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 27 Jun 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-in-app-feed-components-for-ios-and-android"><a href="#in-app-feed-components-for-ios-and-android" tabindex="-1"><span></span></a>In-app feed components for iOS and Android</h2>
<p>Today we're releasing an update to our native mobile SDKs across <a href="https://docs.knock.app/sdks/ios/overview">iOS</a> and <a href="https://docs.knock.app/sdks/android/overview">Android</a> to include pre-built components for powering out-of-the-box in-app feed experiences within your mobile applications. Previously, you had to build your own in-app feed experiences on top of our SDK. Now, with these new components, you can easily add an in-app feed to your app with just a few lines of code. Knock takes care of all of the heavy lifting for you, including fetching and displaying the feed items, handling pagination, real-time badge counts, filtering, and more.</p>
<p>Our in-app feed components are customizable and can be tailored to fit your app's design and user experience. If you need more flexibility you can bring your own UI components, and build on top of the view models provided.</p>
<p>You can get started by reading the documentation on <a href="https://docs.knock.app/in-app-ui/ios/components">iOS</a> and <a href="https://docs.knock.app/in-app-ui/android/overview">Android</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We gave the main dashboard sidebar UI an overhaul, updating the icons in the process</li>
<li>👀 We migrated the colors in the dashboard to our new design system, Telegraph</li>
<li>👀 We added new filters for the messages API for engagement status, inserted at ranges, and by a list of message ids</li>
<li>🐛 We fixed an issue where the code editor would fallback to a serif on certain browsers</li>
<li>🐛 We fixed an issue with the tenants API that could cause a 500 error when creating or listing tenants</li>
<li>🐛 We fixed an issue with the code editor where you could not scroll the content when using the popout editor</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Automated push token deregistration]]></title>
            <description><![CDATA[Automatically clean up push tokens from your users when a token has expired]]></description>
            <link>https://knock.app/changelog#2024-06-20</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-06-20</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 20 Jun 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-automated-push-token-deregistration"><a href="#automated-push-token-deregistration" tabindex="-1"><span></span></a>Automated push token deregistration</h2>
<p>Today we're launching an enhancement to our push notification and device token management functionality. We will now auto revoke tokens that are expired from your user's channel data. Previously, you would need to listen to a <code>message.bounced</code> webhook and execute the token cleanup yourself when your push notifications failed to send.</p>
<p>Now, you can simply enable the option under your push channel settings to "Enable push token deregistration" and we'll automatically remove the expired token from your user's channel data when a push notification fails to send. This will help you keep your user's data clean and up to date without needing to write any additional code.</p>
<p>This feature is available today for all customers. To get started, check out the <a href="https://docs.knock.app/integrations/push/overview">documentation for push notifications</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added a new error page to better report any dashboard issues to our engineering team</li>
<li>👀 We made some light improvements to various empty states around the dashboard</li>
<li>👀 We added a missing filter for workflows to filter for all workflows that have a <code>webhook</code> step</li>
<li>👀 We now fall back to a recipient ID in the messages table when no email or name is provided on the recipient</li>
<li>🐛 We fixed an issue with single ticks in a Slack markdown template would cause a template rendering error</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Add in-app notification actions from our template editor]]></title>
            <description><![CDATA[Enable less technical users to add inline actions to your in-app notifications from within the Knock template editor]]></description>
            <link>https://knock.app/changelog#2024-06-06</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-06-06</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 06 Jun 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-actionable-in-app-notifications"><a href="#actionable-in-app-notifications" tabindex="-1"><span></span></a>Actionable in-app notifications</h2>
<p>Today we’re launching an enhancement to our in-app notifications to support more actionable types of messages, without needing to drop down into code. Previously, to add inline actions to your in-app notifications you needed to customize a feed cell component. With our new in-app actions you can now toggle between a standard, single-action, or multi-action notification template directly in our template editor.</p>
<p>By default, in-app actions will direct you to the action URL you set on the button on click, but you can also override this behavior by providing a new <code>onNotificationButtonClick</code> callback to handle the action in your app.</p>
<p>As part of this update, we also refreshed the in-app editor UI with a new look and feel to make it easier and faster to create and preview your in-app notifications.</p>
<p>You'll need to upgrade to the latest version of our SDKs across web and mobile to take advantage of the new actionable in-app templates. To get started, check out the <a href="https://docs.knock.app/in-app-ui/overview">documentation for in-app notifications</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We now show your account ID under the Settings page in the dashboard.</li>
<li>🐛 We fixed an issue with our conditions logic where <code>contains</code> and <code>not_contains</code> would not operate correctly when the <code>argument</code> was a list.</li>
<li>🐛 We fixed an issue with our chat and HTTP templates that meant we would double JSON encode values sent from trigger data leading to incorrect results in a rendered template.</li>
<li>🐛 We fixed a performance issue with our new code editor where large templates would feel laggy to edit.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing Translations 2.0]]></title>
            <description><![CDATA[Announcing Translations 2.0: draft templates in your default language and auto-generate your translations behind the scenes. Now with PO file support.]]></description>
            <link>https://knock.app/changelog#2024-05-29</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-05-29</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 29 May 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-introducing-the-t-tag-draft-content-in-your-default-language-and-auto-generate-translations"><a href="#introducing-the-t-tag-draft-content-in-your-default-language-and-auto-generate-translations" tabindex="-1"><span></span></a>Introducing the t tag: draft content in your default language and auto-generate translations</h2>
<p>Today we’re introducing a new way to create and manage translations in Knock: the <code>t</code> tag.</p>
<p>With our user-friendly <code>t</code> tag, you can draft message templates in your default language (e.g. english), then wrap the content in a <code>t</code> tag to auto-generate a default language translation file for you behind the scenes.</p>
<p>You can then automate translations to other languages by using our API to fetch your translation files, send them to your translation provider (e.g. Transifex), and programmatically bring translations back into Knock.</p>
<p><strong>Here’s why we shipped the <code>t</code> tag.</strong></p>
<p>In our Translations 1.0 release we introduced the concept of Translations into Knock. Translations are JSON objects you use to define a set of translation keys (for example, “WelcomeMessage”) and the translations they map to in each locale you support (en: “Welcome to Knock”, es: “Bienvenidos a Knock”). You then use our <a href="https://docs.knock.app/concepts/translations#using-the-t-filter"><code>t</code> filter</a> to reference that translated content in your message templates.</p>
<p>Our first approach to Translations works great for teams that already have translations for their messages. But, as we’ve grown and seen customers bring more of their organization into Knock, we heard feedback that we needed a way to make translations more accessible for non-technical users creating content in Knock—that’s where our new <code>t</code> tag comes in.</p>
<p><code>t</code> tags are now generally available for all enterprise customers. To get started, check out the <a href="https://docs.knock.app/concepts/translations#get-started">documentation for Translations</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 When a collection contains more than 10,000 records, we now correctly reflect that in the result count.</li>
<li>👀 We improved our recipient inline identify calls to accept a dictionary with just an <code>id</code> in it, rather than requiring an id and at least one property before it was identified.</li>
<li>👀 We rolled out our new code editor everywhere in the UI.</li>
<li>🐛 We fixed an issue where our pagination controls would show <code>0</code> instead of a result count.</li>
<li>🐛 We fixed an issue where our markdown validation was overly strict and did not allow for some valid HTML elements and attributes.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing: template editor 2.0]]></title>
            <description><![CDATA[The newest version of our template editor includes typeahead autocomplete and a formatting toolbar]]></description>
            <link>https://knock.app/changelog#2024-05-16</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-05-16</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 16 May 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="introducing-typeahead-autocomplete-and-our-formatting-toolbar">Introducing typeahead autocomplete and our formatting toolbar</h2>
<p>Today we’re launching two enhancements to our template editing experience: typeahead autocomplete and a rich text formatting toolbar. These improvements make it easier to write markdown and liquid within our template editor.</p>
<p>First, autocomplete. Now all of the variables available in your workflow run scope, including trigger data, user properties, and more, are available to you in a typeahead autocomplete experience. We’ve also included all of <a href="https://shopify.github.io/liquid/">Liquid’s</a> available filters, so you can easily find the right tool to work with your template data.</p>
<p>Next, we added a new formatting toolbar to apply styling to your markdown templates using a familiar rich text editing interface. This means that whether or not you're familiar with markdown, you'll still be able to author rich text content within the Knock template editor.</p>
<p><video controls muted><source src="/assets/changelog/template-editor-v2.mp4" type="video/mp4" /></video></p>
<h2 id="fixes-and-improvements">Fixes and improvements</h2>
<ul>
<li>👀 We overhauled our preferences documentation and introduced a new preferences section into the documentation to better explain the different portions of preferences within Knock</li>
<li>🐛 We updated the version of the WhatsApp API from v14 to v19</li>
<li>🐛 We fixed an issue where <code>app_name</code> and <code>app_url</code> were not being exposed under the "Settings > Variables" section of the dashboard</li>
<li>🐛 We fixed the <code>useAuthenticatedKnockClient</code> hook in <code>@knocklabs/react</code> to prevent re-renders from occurring</li>
<li>🐛 We fixed a type error in our Go SDK where <code>Messages</code> would not work when a recipient was an object</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing: Directory sync]]></title>
            <description><![CDATA[You can now use an Identity Management Provider like Okta to manage user access to Knock.]]></description>
            <link>https://knock.app/changelog#2024-05-08</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-05-08</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 08 May 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-manage-user-access-with-directory-sync"><a href="#manage-user-access-with-directory-sync" tabindex="-1"><span></span></a>Manage user access with directory sync</h2>
<p>Today we’re releasing support for directory sync within Knock. When enabled, organizations leveraging an Identity Management Platform like Okta can auto-provision, de-provision, and assign roles to users based within Knock. If you use Okta as your identity provider, you can map Okta groups to specific roles within Knock.</p>
<p>Directory sync is available to all customers on our enterprise plan. Read <a href="https://docs.knock.app/manage-your-account/directory-sync">our documentation</a> to learn more about using directory sync, and reach out <a href="https://knock.app/contact-sales">here</a> to learn more about our enterprise offering.</p>
<h2 id="user-content-send-push-notifications-with-onesignal"><a href="#send-push-notifications-with-onesignal" tabindex="-1"><span></span></a>Send push notifications with OneSignal</h2>
<p>We’re thrilled to announce that we now support OneSignal as a push notification provider. You can now send push notifications via OneSignal while continuing to orchestrate your multi-channel notifications with Knock.</p>
<p>To set up OneSignal as a provider in Knock, check out our <a href="https://docs.knock.app/integrations/push/one-signal">documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed an issue with our Node SDK where sending a query parameter as <code>undefined</code> would pass it through to the request.</li>
<li>👀 When you create an account in Knock, we now create two default variables for you for <code>app_url</code> and <code>app_name</code>.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing: Workflow trigger conditions]]></title>
            <description><![CDATA[You can now add conditions to any trigger step, allowing you to halt a workflow from executing before any steps run.]]></description>
            <link>https://knock.app/changelog#2024-05-02</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-05-02</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 02 May 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="add-conditions-to-workflow-triggers">Add conditions to workflow triggers</h2>
<p>Today we’re adding the ability to set workflow trigger conditions on any trigger step. Previously to stop a workflow from executing, you needed to use a branch step at the start of your workflow with no channel steps in the branch. Now using trigger step conditions, you can halt a workflow from executing before any steps run.</p>
<p>This is especially helpful in cases where you have a high volume event stream that you’d like to point at a Knock workflow and then use a trigger condition to select when the workflow should actually run. As an example, you could have an account-balance-updated event connected to a workflow, with a trigger condition to only run the workflow when the account balance goes under five dollars.</p>
<p>You can access trigger step conditions by selecting any trigger step in the workflow builder or using the conditions object in your workflow definition in our management API.</p>
<p><video controls muted><source src="/assets/changelog/trigger-conditions.mp4" type="video/mp4" /></video></p>
<h2 id="fixes-and-improvements">Fixes and improvements</h2>
<ul>
<li>🐛 We fixed an issue with our React Native SDK that incorrectly referenced <code>document</code> when instantiating a feed</li>
<li>🐛 We fixed an issue with our JS client SDK where extra event listeners could be created when auto-managing sockets is enabled</li>
<li>🐛 We fixed an issue where a deleted schedule could leave ghost schedules running</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing: Mobile SDKs for Swift, Kotlin, Flutter, and React Native]]></title>
            <description><![CDATA[Today we are releasing v1.0 of our Mobile SDKs for Swift, Kotlin, Flutter, and React Native.]]></description>
            <link>https://knock.app/changelog#2024-04-18</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-04-18</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 18 Apr 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-introducing-mobile-sdks-for-swift-kotlin-flutter-and-react-native"><a href="#introducing-mobile-sdks-for-swift-kotlin-flutter-and-react-native" tabindex="-1"><span></span></a>Introducing: Mobile SDKs for Swift, Kotlin, Flutter and React Native</h2>
<p>Today we are releasing v1.0 of our Mobile SDKs. Our mobile SDKs wrap Knock’s client APIs and provide powerful abstractions for setting up push notifications and building in-app notification experiences.</p>
<p>Here is what we’re shipping today:</p>
<ul>
<li><strong>Native support &#x26; cross-platform libraries</strong>: Available for <a href="https://docs.knock.app/sdks/ios/overview">iOS (Swift)</a>, <a href="https://docs.knock.app/sdks/android/overview">Android (Kotlin)</a>, <a href="https://docs.knock.app/sdks/react-native/overview">React Native</a>, and <a href="https://docs.knock.app/sdks/flutter/overview">Flutter</a>.</li>
<li><strong>Streamlined push notifications</strong>: We’ve done the schlep work for you: setup is as simple as adding a few lines of code.</li>
<li><strong>In-app notifications</strong>: Methods for fetching, displaying, and managing in-app notifications, along with the ability to connect to our real-time infrastructure.</li>
<li><strong>User preferences</strong>: A preferences API and SDK methods make it easy to manage notification preferences within apps, allowing users to customize notification settings.</li>
</ul>
<p>You can read about all of our SDKs in <a href="https://docs.knock.app/sdks/overview">our documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We renamed the "Defaults" option in the developers menu in the dashboard to be "Preferences"</li>
<li>👀 We added React 16 support to our React SDK and improved the bundle size by removing excess dependencies</li>
<li>🐛 We fixed an issue with our React SDK where event listeners were not being cleaned up</li>
<li>🐛 We fixed an issue with switching environments when setting preference environment defaults that would cause the editor to not be updated</li>
<li>🐛 We fixed an issue with our preference setting endpoints where having null preferences could cause updates to fail</li>
<li>🐛 We fixed an issue with some message webhooks types that would cause them to fail to register</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Revert a commit]]></title>
            <description><![CDATA[We’re expanding the capabilities of our commit system to include the ability to revert a specific commit.]]></description>
            <link>https://knock.app/changelog#2024-04-10</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-04-10</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 10 Apr 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-revert-a-commit"><a href="#revert-a-commit" tabindex="-1"><span></span></a>Revert a commit</h2>
<p>Today we’re expanding the capabilities of our commit system to include the ability to revert a specific commit. Reverting a commit makes it easy to undo a set of changes you already committed.</p>
<p>Previously when using the Knock commit system, there was no way to reverse a change that had been committed. With revert commits, you can reverse a change directly in the dashboard.</p>
<p>Read more about commits <a href="https://docs.knock.app/concepts/commits">in the docs</a>.</p>
<p>You can also check out <a href="https://www.youtube.com/watch?v=jwJAR_Gw-Fo">this video</a> to see how you can revert a commit from the dashboard.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed an issue where <code>skipped</code> message statuses were not always evaluated correctly.</li>
<li>🐛 We fixed an issue where channel data set on a tenant would be incorrectly exposed in the variable pane.</li>
<li>🐛 We fixed an issue where system properties like <code>phone_number</code> were not able to be modified when used as preview data on a workflow.</li>
<li>🐛 We fixed an issue where our Slack auth API would return a 500 without returning a descriptive error.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Preferences in workflow run logs]]></title>
            <description><![CDATA[You can now see the exact preference set that was evaluated during that workflow run.]]></description>
            <link>https://knock.app/changelog#2024-04-04</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-04-04</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 04 Apr 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-preferences-in-workflow-run-logs"><a href="#preferences-in-workflow-run-logs" tabindex="-1"><span></span></a>Preferences in workflow run logs</h2>
<p>In workflow run logs, you can now see the exact preference set that was evaluated during that workflow run. Previously, this information was not surfaced.</p>
<p>Beyond the new preferences section, you can find some additional changes to this section of the dashboard:</p>
<ul>
<li>The overview section of a workflow run log now shows workflow run ID, which is useful for debugging.</li>
<li>All data about the trigger step is now nested under “trigger” in the workflow run log.</li>
<li>We added a refetch button if you need to reload a workflow run log. Previously you needed to reload the entire page.</li>
<li>If your workflow has a delay step, the status is updated in real time, indicating when the step has been completed.</li>
</ul>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added support for side loading preferences when listing users and objects via the API.</li>
<li>👀 We added support for the <code>sum</code> filter in liquid.</li>
<li>👀 We added support for filtering subscribers of objects by <code>recipients</code> and for filtering the subscriptions of a recipient by <code>objects</code>.</li>
<li>👀 We now show your account name and icon in mobile push previews.</li>
<li>👀 We removed variable management from the developers section. It is now only located under settings.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing send windows]]></title>
            <description><![CDATA[We added support for send windows which you can use to specify when a channel should send messages.]]></description>
            <link>https://knock.app/changelog#2024-03-26</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-03-26</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 26 Mar 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-announcing-send-windows"><a href="#announcing-send-windows" tabindex="-1"><span></span></a>Announcing: send windows</h2>
<p>We're excited to announce our newest addition to the Knock workflow engine: send windows.</p>
<p>With send windows, you can tell any channel step in your workflow when it should execute and send a message to your customers. For example, if you want to ensure your customers only receive a given transactional email from your product during working hours, you can set its send window for Monday to Friday, between 9:00 a.m. and 6:00 p.m. local user time.</p>
<p>At Knock our mission is to provide engineering and product teams with tooling that helps them build more thoughtful notification experiences for their users, and send windows is a big step forward towards that vision.</p>
<p>Learn more about send windows in <a href="https://docs.knock.app/designing-workflows/send-windows">our docs</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added "Reset all uncommitted changes" to email layouts, translations, and event action mappings.</li>
<li>👀 We now return an error if the <code>Content-Type</code> header is missing from PUT, POST, PATCH, and DELETE API requests with a body.</li>
<li>👀 We moved the account settings page to be a separate page from the rest of the dashboard and refreshed the design.</li>
<li>🐛 We fixed an issue where pagination within the subscriptions view in the dashboard may have led to no results being returned when clicking "Next".</li>
<li>🐛 We fixed an issue where archived sources were still displaying their events within the event selector on a workflow.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing SlackKit]]></title>
            <description><![CDATA[Today we're excited to announce SlackKit, a set of Embeddable UIs and APIs that make it simple to integrate your product with Slack.]]></description>
            <link>https://knock.app/changelog#2024-03-21</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-03-21</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 21 Mar 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we’re releasing SlackKit, a suite of embeddable UIs and APIs that make it simple to connect your product to your customer’s Slack workspace and send notifications to where your customers work.</p>
<p>Behind the scenes, SlackKit:</p>
<ul>
<li>manages your OAuth connection and tokens.</li>
<li>helps your customers select which channels they want to receive notifications in.</li>
<li>integrates seamlessly with the rest of Knock, so you can easily send notifications to Slack alongside any other channel.</li>
</ul>
<p>Shipping a Slack integration has never been easier.</p>
<p><a href="/blog/announcing-slackkit">Read the full announcement -></a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Heap extension for analyzing customer engagement]]></title>
            <description><![CDATA[We added support for sending message delivery and engagement data to Heap.]]></description>
            <link>https://knock.app/changelog#2024-03-13</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-03-13</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 13 Mar 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-heap-extension-for-analyzing-customer-engagement"><a href="#heap-extension-for-analyzing-customer-engagement" tabindex="-1"><span></span></a>Heap extension for analyzing customer engagement</h2>
<p>Today we’re adding support for sending message delivery and engagement data to Heap—a digital insights platform to analyze customer engagement.</p>
<p>This release adds Heap alongside our existing Segment integration as a way to get data out of Knock for analyzing notification usage and engagement.</p>
<p>Note, to correctly analyze custom events in Heap, follow <a href="https://help.heap.io/data-types/events/how-to-use-custom-events-to-build-new-events/">these steps</a> to build new events.</p>
<p>Learn more about our Heap extension in <a href="https://docs.knock.app/integrations/extensions/heap">our docs</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We improved the way that event payload data shows in the variable pane.</li>
<li>👀 We added a new <code>onAuthenticationComplete</code> handler to our <code>SlackAuthButton</code> component in the React SDK.</li>
<li>🐛 We fixed an issue with filtering workflows in the workflow run logs view.</li>
<li>🐛 We fixed an issue where calling the set tenant API with an invalid payload would return a 500.</li>
<li>🐛 We fixed an issue where the workflow template gallery in the dashboard would load in an incorrect initial state.</li>
<li>🐛 We fixed an issue where you could pass <code>[null]</code> as valid tokens when setting channel data for push channels.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing our new command menu]]></title>
            <description><![CDATA[We've added a new command menu in the Knock dashboard to easily navigate around the Knock dashboard]]></description>
            <link>https://knock.app/changelog#2024-03-01</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-03-01</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 01 Mar 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-introducing-our-new-command-menu-cmdk"><a href="#introducing-our-new-command-menu-cmdk" tabindex="-1"><span></span></a>Introducing our new command menu (cmd+k)</h2>
<p>We've added a new way to navigate across the Knock dashboard and perform common actions through our new command menu. The command menu gives you a quick and easy way to:</p>
<ul>
<li>Search and navigate to a particular workflow</li>
<li>Switch between your Knock environments</li>
<li>Search for a user using their id or email</li>
<li>Quick copy your API keys</li>
<li>... and much more!</li>
</ul>
<p>You can get started using the command menu in the dashboard by clicking the new "Search" link in the sidebar, or for all those keyboard shortcut lovers, by typing <code>cmd+k</code>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added a new "Promote" button to the view commit modal to promote the commit to the next environment.</li>
<li>🐛 We fixed an issue where using an event type trigger for a workflow would not default the data section in the variable pane.</li>
<li>🐛 We fixed a regression in our Node SDK where the remove subscriptions objects method would fail.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New Relic extension + new outbound webhook types]]></title>
            <description><![CDATA[We've added support for reporting metrics to New Relic, and added new outbound webhook event types]]></description>
            <link>https://knock.app/changelog#2024-02-16</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-02-16</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 16 Feb 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-new-relic-observability-extension"><a href="#new-relic-observability-extension" tabindex="-1"><span></span></a>New Relic observability extension</h2>
<p>Today we’re extending support for reporting notification metrics to New Relic. Previously, we only supported <a href="https://docs.knock.app/integrations/extensions/datadog">Datadog</a> as an observability platform, but with today’s release, we’re introducing support for reporting metrics to New Relic as well.</p>
<p>You can read more <a href="https://docs.knock.app/integrations/extensions/new-relic">in the documentation</a> about the types of metrics reported. Our New Relic extension is available to customers on our Enterprise plan only.</p>
<h2 id="user-content-new-outbound-webhook-event-types"><a href="#new-outbound-webhook-event-types" tabindex="-1"><span></span></a>New outbound webhook event types</h2>
<p>Today we're announcing support for new types of events in outbound webhooks, making it even easier to deeply integrate Knock into your application's workflow. With today's release, you can now listen to changes for any version-controlled content within your Knock dashboard, including workflows, email layouts, and translations.</p>
<p>You can find the full set of supported webhook events <a href="https://docs.knock.app/developer-tools/outbound-webhooks/event-types">in the documentation</a> and can create a webhook by going to the "Developers > Webhooks" section in the Knock dashboard.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We greatly improved the bundle size in our <code>@knocklabs/react</code> package by removing the dependency on the <code>date-fns</code> library.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing our new Flutter SDK]]></title>
            <description><![CDATA[Announcing our new Flutter SDK that simplifies the integration of Knock into your Flutter application.]]></description>
            <link>https://knock.app/changelog#2024-02-06</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-02-06</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 06 Feb 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-our-flutter-sdk"><a href="#our-flutter-sdk" tabindex="-1"><span></span></a>Our Flutter SDK</h2>
<p>Today we’re shipping our <a href="https://github.com/knocklabs/knock-flutter">new Flutter SDK</a>, which is a client-side SDK written in Dart to interact with the Knock API and to build in-app notification experiences in Flutter applications.</p>
<p>We have big plans for more in-product experiences that we’ll be bundling into this SDK in the near future. Today’s release is a first step towards that future, giving the base primitives to easily bring all of the functionality of Knock into your applications in an easy-to-consume way.</p>
<p>You can learn more in our <a href="https://docs.knock.app/in-app-ui/flutter/overview">Flutter SDK documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added a link to view usage for Enterprise customers under the "Billing" page</li>
<li>👀 We redesigned the empty states across the dashboard</li>
<li>🐛 We fixed an issue where our Vonage integration would fail when sending multi-part messages</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing commit diffs]]></title>
            <description><![CDATA[Today we are releasing an upgraded version control experience in Knock, commit diffs."]]></description>
            <link>https://knock.app/changelog#2024-01-31</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-01-31</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 31 Jan 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-announcing-commit-diffs"><a href="#announcing-commit-diffs" tabindex="-1"><span></span></a>Announcing commit diffs</h2>
<p>Today we’re releasing a big upgrade to the version control experience in Knock with commit diffs.</p>
<p>With this release, you can now:</p>
<ul>
<li>View a commit to see what has changed between that commit and the prior version of the workflow.</li>
<li>Review a diff when promoting a commit to an environment. You will see the diff between the current state of that environment and the pending commit.</li>
<li>Audit the full history of commit diffs in your commit log to know exactly what's changed over time.</li>
</ul>
<p><a href="/blog/announcing-commit-diffs">Read the full announcement here —></a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New Android SDK]]></title>
            <description><![CDATA[Announcing our new Android SDK that simplifies the integration of Knock into your Android application.]]></description>
            <link>https://knock.app/changelog#2024-01-24</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-01-24</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 24 Jan 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-new-android-sdk"><a href="#new-android-sdk" tabindex="-1"><span></span></a>New Android SDK</h2>
<p>Today, we’re shipping our <a href="https://github.com/knocklabs/knock-android">new Android SDK</a>, which is a client-side SDK written in Kotlin to interact with the Knock API and to build in-app notification experiences in Android applications.</p>
<p>We have big plans for more in-product experiences that we’ll be bundling into this SDK in the near future. Today’s release is a first step towards that future, giving the base primitives to easily bring all of the functionality of Knock into your applications in an easy-to-consume way.</p>
<p>You can learn more in our <a href="https://docs.knock.app/in-app-ui/android/overview">Android SDK Documentation</a>, or get started now by <a href="https://github.com/knocklabs/knock-android?tab=readme-ov-file#installation">following the installation instructions</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added support for edge runtimes, like Vercel and Cloudflare Workers, in <a href="https://github.com/knocklabs/knock-node/releases/tag/v0.6.0">our Node JS SDK</a></li>
<li>👀 We now show a channel data tab when viewing an individual tenant in the dashboard</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New React SDK]]></title>
            <description><![CDATA[We released a new React SDK which makes integrating Knock into your app ]]></description>
            <link>https://knock.app/changelog#2024-01-19</link>
            <guid isPermaLink="false">https://knock.app/changelog#2024-01-19</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 19 Jan 2024 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-new-react-sdk"><a href="#new-react-sdk" tabindex="-1"><span></span></a>New React SDK</h2>
<p>Today, we’re shipping our <a href="https://www.npmjs.com/package/@knocklabs/react">new React SDK (<code>@knocklabs/react</code>)</a>, which provides a unified set of hooks and components for integrating Knock into your web applications. You can use our React package to power in-app notification experiences like feeds, toasts, and banners for your users, as well as powering notification configuration via our preferences API.</p>
<p>Our new SDK is the home of all in-product notification experiences powered by Knock, superseding the previous <code>react-notification-feed</code> package. If you’re using the old package, you can <a href="https://docs.knock.app/in-app-ui/react/migrating-from-react-notification-feed">read here on how to migrate</a>.</p>
<p>We have big plans for more in-product experiences that we’ll be bundling into this package in the near future. Today’s release is a first step towards that future, giving the base primitives to easily bring all of the functionality of Knock into your applications in an easy-to-consume way.</p>
<p>You can install the React SDK from NPM by running <code>npm install @knocklabs/react</code> and can find the package in our <a href="https://github.com/knocklabs/javascript">brand new Javascript monorepo</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We improved the loading time of message views within the Dashboard</li>
<li>👀 We now validate certificates when configuring an APNS channel</li>
<li>👀 We now validate the service account JSON when configuring a FCM channel</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[One-off schedules + in-app feed API response customization]]></title>
            <description><![CDATA[We added support for one-off, non-recurring scheduled workflows, and added the ability to customize what the in-app feed API returns.]]></description>
            <link>https://knock.app/changelog#2023-12-12</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-12-12</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 12 Dec 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-schedule-one-off-workflow-runs"><a href="#schedule-one-off-workflow-runs" tabindex="-1"><span></span></a>Schedule one-off workflow runs</h2>
<p>Earlier this year we released the ability to run recurring workflows for your users via our <a href="https://docs.knock.app/reference#schedules">Schedules API</a>. Today, we're releasing an extension to our schedules API with the ability to schedule a single workflow run in the future for one or more recipients. One-off schedules are perfect to enqueue a workflow that should be run at some future point, without you needing to write your own cron jobs to do so.</p>
<p>Here's an example of creating a one-off schedule for a set of recipients:</p>
<pre><code class="language-js">await knock.workflows.createSchedules("park-alert", {
  recipients: ["jhammond", "esattler", "dnedry"],
  scheduled_at: "2023-12-25 12:00:00Z"
  data: { type: "dinosaurs-loose" },
  tenant: "jpark",
});
</code></pre>
<p>You can learn more about running one-off or recurring schedules <a href="https://docs.knock.app/concepts/schedules">in the documentation</a>.</p>
<h2 id="user-content-customize-the-response-of-the-in-app-feed"><a href="#customize-the-response-of-the-in-app-feed" tabindex="-1"><span></span></a>Customize the response of the in-app feed</h2>
<p>Today, we’re launching additional privacy controls for our <a href="https://docs.knock.app/reference#get-feed">in-app feed API</a>. Previously, when your recipient’s in-app feeds were requested, the response would include the full recipient object, which could lead to personal data about your recipient being returned unnecessarily.</p>
<p>With today's release, you can now use allow or deny lists to control which fields are returned from any entity in your feed request. Here's an example in-app feed response filter:</p>
<pre><code class="language-json">{
  "actor": {
    "only": ["id"]
  },
  "data": {
    "except": ["credit_card_last4"]
  }
}
</code></pre>
<p>Read more <a href="https://docs.knock.app/integrations/in-app/knock#customizing-api-response-content">in the documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed an issue where clicking links in a message preview could crash the dashboard</li>
<li>🐛 We fixed an issue where using tenants as a recipient in a workflow trigger would stop workflow runs from showing</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Promote individual commits in the CLI]]></title>
            <description><![CDATA[We added support for promoting individual commits in the CLI, allowing you to promote only the resources you need.]]></description>
            <link>https://knock.app/changelog#2023-11-16</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-11-16</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 16 Nov 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-promote-individual-commits-in-the-cli"><a href="#promote-individual-commits-in-the-cli" tabindex="-1"><span></span></a>Promote individual commits in the CLI</h2>
<p>You can now use the Knock <a href="https://knock.app/cli">CLI</a> to promote individual commits. This was previously available in the dashboard, and today we're bringing it to the CLI. With this addition, it makes it easy to build specific deployement workflows that only promotes the resources you need.</p>
<p>Individual commit promotion is available now in the latest version of the CLI (<code>v0.1.7</code>) and is available across all plans. You can read more in <a href="https://docs.knock.app/cli">the documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 You can now go directly to the workflow editor from the workflows page using the 3-dot menu</li>
<li>👀 You can now use cmd+return in the preview data editor to save the data and close the modal</li>
<li>🐛 We fixed an issue where the update schedules endpoint was missing schema validation for an empty properties object</li>
<li>🐛 We fixed an issue where breadcrumbs didn't load properly on our docs site</li>
<li>🐛 We fixed a few tooltip and text display issues in the Dashboard</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Email layouts in the CLI + batch item render limits]]></title>
            <description><![CDATA[We added support for managing email layouts in the CLI and shipped the ability to change the batch render limit]]></description>
            <link>https://knock.app/changelog#2023-10-24</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-10-24</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 24 Oct 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-manage-email-layouts-via-the-cli-and-management-api"><a href="#manage-email-layouts-via-the-cli-and-management-api" tabindex="-1"><span></span></a>Manage email layouts via the CLI and management API</h2>
<p>With the introduction of our <a href="/blog/announcing-knock-cli">CLI and management API earlier this year</a>, we added support for working with both workflows and translations locally. Now, we've added support for managing <a href="https://docs.knock.app/integrations/email/layouts">email layouts</a> via the CLI and management API, making it possible to pull down your email layouts locally, make changes to those layouts, and push them back up to Knock to be deployed.</p>
<p>Working with email layouts is available now in the latest version of the CLI (<code>v0.1.x</code>) and is available across all plans. You can read more in <a href="https://docs.knock.app/cli">the documentation</a>.</p>
<h2 id="user-content-control-the-number-of-items-rendered-in-a-batch-template"><a href="#control-the-number-of-items-rendered-in-a-batch-template" tabindex="-1"><span></span></a>Control the number of items rendered in a batch template</h2>
<p>While our <a href="https://docs.knock.app/designing-workflows/batch-function">batch function</a> has always allowed an unlimited number of items to be accumulated per-batch, the number of items that could be <em>rendered</em> in a template from that batch has always been limited to the first or last 10 items. Today, we're adding a new setting into our batch function to control the number of items that can be rendered, with the ability to render up-to 100 items.</p>
<p>Batch render limits are available now on our Enterprise plan only. You can read more in <a href="https://docs.knock.app/designing-workflows/batch-function">the documentation</a>, or contact our <a href="/contact-sales">sales team today to arrange a demo</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We now highlight the "Developers > Logs" menu item when viewing workflow runs</li>
<li>👀 All new accounts now have an in-app feed channel setup by default</li>
<li>🐛 We fixed a bug where in certain cases hourly schedules would not repeat</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[User deletion + bypassing recipient preferences]]></title>
            <description><![CDATA[We added support for deleting content associated with a user, and added a control to bypass recipient preferences per workflow]]></description>
            <link>https://knock.app/changelog#2023-10-11</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-10-11</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 11 Oct 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-user-deletion-and-right-to-be-forgotten-requests"><a href="#user-deletion-and-right-to-be-forgotten-requests" tabindex="-1"><span></span></a>User deletion and right to be forgotten requests</h2>
<p>We've expanded the scope of our user deletion endpoint.  Now we permanently delete all content associated with a user upon receiving a deletion request. This means that Knock user deletion is now fully GDPR-compliant and can be used to programmatically process right to be forgotten requests. Previously we had supported these requests in an ad-hoc way through our customer support, but with this change you can now programmatically call the <a href="https://docs.knock.app/reference#delete-user">user delete</a> or <a href="https://docs.knock.app/reference#bulk-delete-users">bulk delete</a> APIs and have all content for a user permanently removed.</p>
<p>You can learn more in our <a href="https://docs.knock.app/managing-recipients/deleting-users">user deletion documentation</a> -></p>
<h2 id="user-content-bypass-recipient-preference-evaluation"><a href="#bypass-recipient-preference-evaluation" tabindex="-1"><span></span></a>Bypass recipient preference evaluation</h2>
<p>We've introduced a per-workflow control to bypass recipient preferences. This is useful in situations where you need to force a critical notification through to a recipient (such as a password reset email) regardless of that recipient's channel preferences.</p>
<p>You can find the new preference control under "Manage workflow" in the workflow three-dot menu. You can learn more in the <a href="https://docs.knock.app/concepts/preferences#overriding-recipient-preferences">preferences documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We changed the admin role to be able to create and manage environments</li>
<li>👀 We changed our combobox behavior for selecting recipients and actors to load a page of data to aid with selection</li>
<li>👀 We added support for per-customer overrides for idempotency windows</li>
<li>🐛 We fixed an issue where the workflow category selector was case sensitive</li>
<li>🐛 We fixed an issue where the <code>knock.messages.delivered</code> metric was not being sent to Datadog</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Maximum batch limit]]></title>
            <description><![CDATA[We added a maximum batch items limit to our batch function, plus more fixes and improvements]]></description>
            <link>https://knock.app/changelog#2023-10-04</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-10-04</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 04 Oct 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-set-a-maximum-batch-limit"><a href="#set-a-maximum-batch-limit" tabindex="-1"><span></span></a>Set a maximum batch limit</h2>
<p>Today we're releasing a new way to close your notification batches, by setting a maximum number of items allowed. This means a batch can now close either temporally (when the batch window ends), or when a certain number of items have been accumulated, giving you even more flexibility on how you batch your notifications.</p>
<p>You can set a maximum batch item limit under the batch step settings. Read more in the <a href="https://docs.knock.app/designing-workflows/batch-function#setting-the-maximum-batch-limit">documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added a new <a href="https://docs.knock.app/reference#bulk-add-subscriptions">bulk add subscriptions API endpoint</a></li>
<li>👀 We changed the behavior of our recipient preferences set endpoints to create empty recipient's when setting preferences for new recipients instead of 404-ing</li>
<li>👀 We increased the limit on all of our bulk operation endpoints from 100 to 1000 items at a time</li>
<li>👀 We added support for the Mailtrap email testing API</li>
<li>👀 We added an email field to our docs feedback component</li>
<li>👀 We now expose subscription information under a recipient when triggering a workflow from a subscription</li>
<li>🐛 We fixed an issue where you could not manage subscriptions under a tenant object</li>
<li>🐛 We fixed an issue where some email clients would not report tracking information correctly</li>
<li>🐛 We fixed an issue with our batch steps where in certain cases, using a sliding batch window could extend to the maximum batch duration</li>
<li>🐛 We fixed an issue where using the CLI to push translations with no changes would result in uncommitted changes being generated</li>
<li>🐛 We fixed an issue where webhooks were not being properly created via the Dashboard</li>
<li>🐛 We fixed an issue where long variable names would break the layout in the variable pane</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Announcing: Knock workflow builder 2.0]]></title>
            <description><![CDATA[Announcing a complete rebuild of our Knock workflow canvas, including support for multi-branch messaging workflows]]></description>
            <link>https://knock.app/changelog#2023-09-07</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-09-07</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 07 Sep 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we’re announcing the first major update to our workflow canvas since we first launched Knock in beta two years ago. 😁</p>
<p>With this release we’ve rebuilt the Knock workflow builder from the ground up to support:</p>
<ul>
<li><strong>If-else and multi-branch workflows.</strong> Use our branch function to create if-else and multi-path messaging workflows.</li>
<li><strong>An improved user experience.</strong> It’s now easier to drag-and-drop steps into the canvas and reorder steps. We’ve also shipped pan-and-zoom controls for moving around the canvas.</li>
<li><strong>Even better workflow debugging.</strong> With our new branch step, we’ve updated our debugger so you can easily see which branch executed in a given workflow.</li>
</ul>
<p><a href="https://knock.app/blog/announcing-knock-workflow-builder-2">Read the full announcement here —></a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Source event UX and logging improvements]]></title>
            <description><![CDATA[Manage workflow triggers in the builder, run event tests, improved event logging, plus more bug fixes and improvements]]></description>
            <link>https://knock.app/changelog#2023-08-18</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-08-18</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 18 Aug 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-connect-event-triggers-in-the-workflow-builder"><a href="#connect-event-triggers-in-the-workflow-builder" tabindex="-1"><span></span></a>Connect event triggers in the workflow builder</h2>
<p>When working with Segment or a similar integration source in Knock, previously all the configuration would take place in the <code>Sources</code> pages. We've now added the ability to add and change your event triggers directly in the workflow builder. There's a toggle from <code>API</code> to <code>Event</code> in the trigger step that will open the event trigger pane where you can add an event, edit its field mappings, and commit it alongside your workflow.</p>
<h2 id="user-content-run-workflow-tests-with-event-data"><a href="#run-workflow-tests-with-event-data" tabindex="-1"><span></span></a>Run workflow tests with event data</h2>
<p>You can now test your event-driven workflows directly from Knock! Rather than sending a test event from one of your integration sources, the workflow test runner will automatically pull in the latest event received for you to run rehearsals of a workflow powered by events. This helps you fine tune your mappings and make sure you're getting all the necessary data for your notifications without switching between applications.</p>
<h2 id="user-content-improved-event-logging"><a href="#improved-event-logging" tabindex="-1"><span></span></a>Improved event logging</h2>
<p>Previously, our event logging was too strict - instead of logging malformed events coming into Knock, our system would drop them, making it hard to know what was wrong. Now we're logging every event, whether it's valid or not. If it's already triggering a workflow, we'll let you know why it did or didn't work. We've also added logs for our test events so that after every run you'll get the same detailed feedback about what's missing or malformed in your event.</p>
<p>Both of these improvements decrease the amount of time you spend tracking down missing data and gets your event-driven workflows into production faster.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed a bug in preference conditions where <code>not_contains</code> wasn't recognizing <code>null</code> as a truthy value</li>
<li>🐛 We fixed a bug where reset uncommitted changes was enabled even if there were no commits</li>
<li>🐛 We fixed a bug where we were sending duplicate invoices</li>
<li>🐛 We fixed a bug where updating workflow categories were hidden under the modal</li>
<li>🐛 We fixed some bugs around usernames, they can now be nullable and they will not replace existing usernames on login</li>
<li>🐛 We fixed a bug where you couldn't add a condition in channel configuration</li>
<li>👀 The <code>E</code> keybinding for opening a template now works in read-only environments</li>
<li>👀 We've added a cancel workflow run button in workflow run debugger</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Fetch step improvements, Mailtrap provider added, and more]]></title>
            <description><![CDATA[Shipping support for previewing fetched data in your workflow builder, Mailtrap, plus more bug fixes and improvements]]></description>
            <link>https://knock.app/changelog#2023-08-04</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-08-04</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 04 Aug 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-fetch-step-preview-your-fetched-data-in-the-variable-pane"><a href="#fetch-step-preview-your-fetched-data-in-the-variable-pane" tabindex="-1"><span></span></a>Fetch step: preview your fetched data in the variable pane</h2>
<p>Previously when you used a <a href="https://docs.knock.app/designing-workflows/fetch-function">fetch step</a> in a workflow, there was no way to keep track of the properties in the returned payload when building your notification workflows. You would have to memorize the data to use it.</p>
<p>We've shipped a big improvement that eliminates this pain point: we're now storing the fetched data in the workflow variable pane. The variable pane is available in every step of your workflow, so it's now easy to know which variables you can reference as you're building your workflows and message templates. If you have multiple fetch steps in your workflow you'll see a section in the variable pane for each step.</p>
<h2 id="user-content-mailtrap-integration"><a href="#mailtrap-integration" tabindex="-1"><span></span></a>Mailtrap integration</h2>
<p>We now support <a href="https://mailtrap.io/">Mailtrap</a> as an email provider within Knock!</p>
<p>If you are currently using Mailtrap to test and send emails, you can now configure a new email channel with Mailtrap in Knock and start using it in your workflows.</p>
<p><a href="https://docs.knock.app/integrations/email/mailtrap">Learn more in the docs →</a></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed a bug where customers on our legacy plans weren't able to self-service downgrade</li>
<li>🐛 We fixed a bug where tenants weren't able to be inline-identified</li>
<li>🐛 We fixed a bug where users weren't able to open the template gallery</li>
<li>👀 Cancellation keys are now shown in the workflow run log page</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Workflow test runner support for Objects]]></title>
            <description><![CDATA[Run workflow test runs for objects + max duration for batch windows]]></description>
            <link>https://knock.app/changelog#2023-07-12</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-07-12</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 12 Jul 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-workflow-test-runner-support-for-objects"><a href="#workflow-test-runner-support-for-objects" tabindex="-1"><span></span></a>Workflow test runner support for objects</h2>
<p>While it's been possible to use Knock to send notifications to <a href="https://docs.knock.app/send-and-manage-data/objects">non-user recipients</a> for <a href="https://knock.app/changelog/2022-01-14">some time</a>, if you wanted to run a test of the workflow to a non-user recipient you needed to <a href="https://docs.knock.app/reference#trigger-workflow">use the API</a>, adding a small amount of friction to the process.</p>
<p>Today we're shipping support for running workflow test runs for any of the objects you have set in your Knock environment, from the test runner in the dashboard and <a href="https://docs.knock.app/cli#workflow-run">via the CLI</a>. This makes it fast and easy to test sending notifications to your object recipients and makes it possible to easily test <a href="https://docs.knock.app/concepts/subscriptions">recipient subscriptions</a> without needing to call the API.</p>
<p>Test runner support for object recipients is available today across all plans and in the CLI as of version <code>v0.1.4</code>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added the ability to set a maximum duration on a sliding batch window</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Throttle function]]></title>
            <description><![CDATA[Limit the execution of your recipient workflow runs with our new throttle function]]></description>
            <link>https://knock.app/changelog#2023-07-10</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-07-10</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Mon, 10 Jul 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-limit-the-number-of-executions-of-a-workflow-over-a-window-of-time-with-the-throttle-function"><a href="#limit-the-number-of-executions-of-a-workflow-over-a-window-of-time-with-the-throttle-function" tabindex="-1"><span></span></a>Limit the number of executions of a workflow over a window of time with the throttle function</h2>
<p>Today we're launching our new throttle function. With the throttle function, you can limit the number of times a workflow is executed for a recipient within a given window of time, making it trivial to build sophisticated notification alerting workflows that don't spam your users.</p>
<p>Previously if you wanted to throttle the execution of a workflow for a recipient, you would need to keep the logic in your application and control the number of times that your Knock workflow trigger is executed. This means keeping track of the sent notification state and potentially adding additional infrastructure to support this complexity. Now, with the throttle function, you can safely invoke your Knock workflow and know that Knock will apply the throttle controls for you to limit the execution of a workflow for a recipient over the window of time that you specify.</p>
<p>For example, with the throttle function, you can say "execute this workflow at most once per day for each recipient" and safely trigger the Knock workflow any number of times in that window, knowing that if it has already been executed in the window that Knock will terminate the workflow run for you.</p>
<p>Our throttle function is available today across all of our plans. You can read more <a href="https://docs.knock.app/designing-workflows/throttle-function">in the documentation</a> or <a href="/contact-sales">contact our sales team</a> to see a demo.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Data warehouse sync]]></title>
            <description><![CDATA[Sync your Knock notifications data to your data warehouse]]></description>
            <link>https://knock.app/changelog#2023-07-05</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-07-05</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 05 Jul 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-sync-your-notifications-analytics-to-your-data-warehouse"><a href="#sync-your-notifications-analytics-to-your-data-warehouse" tabindex="-1"><span></span></a>Sync your notifications analytics to your data warehouse</h2>
<p>Today we're launching our new analytics data warehouse integration. With this integration you can bring the clean, normalized data Knock produces for your cross-channel notifications into your data warehouse to analyze alongside the rest of your product data. With this connector we support data exports to Snowflake, BigQuery, Redshift, and a number of other destinations.</p>
<p>Previously we had offered a <a href="https://docs.knock.app/integrations/extensions/segment">Segment integration</a> to stream the normalized notification analytics data into downstream destinations, including a data warehouse. Now with our new data warehouse analytics sync you can configure a data warehouse connection in Knock and we'll start streaming our normalized cross-channel notifications <a href="https://docs.knock.app/send-notifications/message-statuses#engagement-status">analytics data</a> directly into your data warehouse, so you can analyze it alongside the rest of your data.</p>
<p>Our data warehouse sync is available today on our enterprise plan. You can read more <a href="https://docs.knock.app/integrations/extensions/data-sync">in the documentation</a> or <a href="/contact-sales">contact our sales team</a> to see a demo.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed an edge case where unsetting channel data could end up marking a recipient's <code>updated_at</code> timestamp as <code>null</code>.</li>
<li>🐛 We fixed an issue where sending a malformed recipient's list to our workflow trigger endpoint would not surface a useable error.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Our new conditions debugger and sliding batch window support]]></title>
            <description><![CDATA[A new conditions debugger in our workflow run logs, sliding windows for batch functions, and more.]]></description>
            <link>https://knock.app/changelog#2023-06-30</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-06-30</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 30 Jun 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-condition-debugging-in-workflow-run-logs"><a href="#condition-debugging-in-workflow-run-logs" tabindex="-1"><span></span></a>Condition debugging in workflow run logs</h2>
<p>Today we're launching a step change in your workflow run debugging experience with our new enhanced conditions debugger that surfaces the conditions we evaluated across step, channel, and preference conditions for each step in your workflow.</p>
<p>Previously, we showed a single log line telling you conditions were not met on step and channel evaluation, leading to a confusing user experience in understanding exactly <em>what</em> caused the condition to not pass. Now, with our new conditions debugger, you can get a clear picture of all of the conditions we evaluated when executing your workflow, including exactly what the variables you're referencing in the conditions evaluated to.</p>
<p>You can read more about the debugging conditions <a href="https://docs.knock.app/send-and-manage-data/conditions#debugging-conditions">in the documentation</a>.</p>
<h2 id="user-content-sliding-batch-window-support"><a href="#sliding-batch-window-support" tabindex="-1"><span></span></a>Sliding batch window support</h2>
<p>We've added support for sliding windows in our batch function. Previously, when a batch was opened the window for which the batch was open was static, meaning that there was no way to extend the window to accumulate more items inside of the batch. Today, we've added a new "sliding" feature on our batch windows so that any new activities that are added to the batch will extend the window that the batch is open by recomputing the batch window.</p>
<p>You can read more about sliding batch windows <a href="https://docs.knock.app/designing-workflows/batch-function#using-a-sliding-batch-window">in the documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added a new <code>contains_all</code> operator to complement our existing <code>contains</code> conditions operator.</li>
<li>🐛 We fixed an edge case with our user and object upsert API where overriding a <code>null</code> property with an object would cause an API 500.</li>
<li>🐛 We fixed an issue where <code>\n</code> characters could cause an issue with push templates.</li>
<li>🐛 We fixed a regression where syntax highlighting was broken in our code editor.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Swift SDK]]></title>
            <description><![CDATA[The launch of our official Knock Swift SDK to power in-app notification experiences in iOS, macOS and more.]]></description>
            <link>https://knock.app/changelog#2023-06-29</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-06-29</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 29 Jun 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-swift-sdk"><a href="#swift-sdk" tabindex="-1"><span></span></a>Swift SDK</h2>
<p>Today we're launching our <a href="https://github.com/knocklabs/knock-swift">Knock Swift SDK</a>, which you can use to build in-app notification experiences in iOS, macOS, and watchOS. Our Swift SDK makes it easy to interface with the Knock in-app feed, wrapping up all of the real-time socket and API querying behavior for you into an easy-to-use package.</p>
<p>The Swift SDK also supports:</p>
<ul>
<li>Getting and setting push token information via channel data.</li>
<li>Working with user preferences to build in-app preference centers.</li>
<li>Updating message engagement statuses to track push notification opens and taps.</li>
<li>... And much more!</li>
</ul>
<p>You can install the SDK from <a href="https://docs.knock.app/in-app-ui/ios/overview#installing-via-swift-package-manager">Swift Package Manager</a>, <a href="https://docs.knock.app/in-app-ui/ios/overview#installing-via-cocoapods">Cocoapods</a>, or <a href="https://docs.knock.app/in-app-ui/ios/overview#installing-via-carthage">Carthage</a>. There's also <a href="https://docs.knock.app/in-app-ui/ios/overview">comprehensive documentation</a> and an <a href="https://github.com/knocklabs/ios-example-app">example iOS app</a> to get you started.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Date filtering for log views]]></title>
            <description><![CDATA[Date filtering on all log views and more.]]></description>
            <link>https://knock.app/changelog#2023-06-16</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-06-16</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 16 Jun 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-date-filtering-for-logs-views"><a href="#date-filtering-for-logs-views" tabindex="-1"><span></span></a>Date filtering for logs views</h2>
<p>We added support for date filtering for all log views in the dashboard, making it easy to find logs that happened on or around a particular date. Finding particular logs is now trivial, which is especially useful when debugging in high-log volume environments.</p>
<p>The new date filter is available now in all log views and across all plans. Please note: you will only be able to retrieve logs in congruence with your plan's retention policy.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 When a workflow is triggered from a subscription, we now include the subscription <code>properties</code> under the <code>recipient.subscription</code> namespace in the workflow run scope (<a href="https://docs.knock.app/send-and-manage-data/subscriptions#accessing-subscription-properties-in-a-workflow-run">docs</a>).</li>
<li>👀 We added support for the <code>pap-AW</code> locale.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[CLI workflow run & request signing]]></title>
            <description><![CDATA[Run workflows from the CLI, add a signing key to your HTTP fetch steps and webhooks, and more.]]></description>
            <link>https://knock.app/changelog#2023-06-06</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-06-06</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 06 Jun 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-run-workflows-from-the-cli"><a href="#run-workflows-from-the-cli" tabindex="-1"><span></span></a>Run workflows from the CLI</h2>
<p>You can now test run your workflows as you're building them, all from the Knock CLI. As you make and push changes, you can use the new <code>workflow run</code> command to trigger a workflow for to up to 5 recipients at a time, enabling quick iterations of your notifications. See how to make these calls in our <a href="https://docs.knock.app/cli#workflow-run">CLI docs</a>.</p>
<h2 id="user-content-add-a-signing-key-to-fetch-steps-and-webhooks"><a href="#add-a-signing-key-to-fetch-steps-and-webhooks" tabindex="-1"><span></span></a>Add a signing key to fetch steps and webhooks</h2>
<p>We’re improving the security of our fetch step and HTTP webhooks by introducing request signing. Request signing allows a secret to be shared between Knock and your service so that you can verify that a request has come from Knock. Learn more about <a href="https://docs.knock.app/designing-workflows/fetch-function#adding-request-signing">enabling this for your workflows</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We improved the performance of loading event and action logs</li>
<li>👀 We increased the granularity of error messages in the debugger</li>
<li>👀 We added a dropdown to navigate between object collections in the dashboard</li>
<li>👀 We now show workflow runs tab on users, objects and tenant pages</li>
<li>👀 You can now filter tenants by name and ID, and we also show the tenant ID and name in workflow runs that include a tenant</li>
<li>👀 When you create a workflow, it is now initially now set to <code>active</code></li>
<li>👀 We made performance and ergonomic improvements to all places that have a user searchbox</li>
<li>👀 You can now edit your data payload as JSON in the workflow template builder</li>
<li>👀 You can delete variables at the environment level</li>
<li>🐛 We fixed a bug where owners of newly created accounts couldn't create new environments</li>
<li>🐛 We fixed a bug in which were treating a batch step skip with a <code>conditions_not_met</code> code as an error in our instrumentation code when in fact it is valid</li>
<li>🐛 We fixed an edge case where a recipient's timezone property doesn't contain a valid timezone</li>
<li>🐛 We fixed an issue where batched workflows that used the same cancellation key weren't being fully canceled</li>
<li>🐛 We now prevent <code>tenant</code> and <code>current_message</code> variables from being extracted from templates into the variable pane when editing a template</li>
<li>🐛 We added better support for when using <code>assign</code> in liquid templates</li>
<li>🐛 We fixed a bug where when switching environments on a translation page the translation wouldn't be found</li>
<li>🐛 We fixed a bug that didn't properly use the <code>scheduled_at</code> date for creating and updating schedules</li>
<li>🐛 We fixed a bug where long condition names would prevent seeing the "..." menu in the workflow builder</li>
<li>🐛 We fixed race condition when scheduling a workflow's next occurrence</li>
<li>🐛 We fixed an issue with cloning a workflow where adding variable properties would error during editing</li>
<li>🐛 We fixed a bug where users couldn't edit Knock-managed environments</li>
<li>🐛 We removed the ability to set a <code>delivered</code> condition on push steps since those aren't supported events for push</li>
<li>🐛 We fixed a bug where the <code>batch_key</code> wouldn't be saved in the workflow builder</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Launch week features]]></title>
            <description><![CDATA[CLI, HTTP Source, Schedules API, Webhook channel, and Subscription API]]></description>
            <link>https://knock.app/changelog#2023-05-23</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-05-23</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 23 May 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>The last couple months have been quiet ones here on the Knock changelog. That's because we were heads down on our first ever launch week. Here's a recap of each of the 5 big changes we shipped.</p>
<h2 id="user-content-http-source"><a href="#http-source" tabindex="-1"><span></span></a>HTTP Source</h2>
<p>HTTP Source lets you trigger your multi-channel notifications from any source that can stream events into Knock. This includes dedicated streaming infrastructure, such as Kafka and Kinesis, as well as any product that can stream events and webhooks (think Supabase functions and Radar location-based events.)</p>
<p>This means you can power Knock with even more parts of your infrastructure to send notifications that are relevant for your customers.</p>
<p><a href="https://knock.app/blog/announcing-knock-http-source">Read the announcement —></a></p>
<h2 id="user-content-cli-and-management-api"><a href="#cli-and-management-api" tabindex="-1"><span></span></a>CLI and management API</h2>
<p>Now developers can work with Knock resources in code, and automate pushing that code back into Knock to run on our platform. Read our docs to learn how you can scale notifications on Knock while managing our system from your CI/CD environment.</p>
<p>The Knock CLI and management API release is a big step forward for both Knock’s developer experience and for what you can build on top of our platform.</p>
<p><a href="https://knock.app/blog/announcing-knock-cli">Read the announcement —></a></p>
<h2 id="user-content-schedules-api"><a href="#schedules-api" tabindex="-1"><span></span></a>Schedules API</h2>
<p>Schedules API is a declarative, code-first way to build recurring notification schedules and to give your users the ability to control when they receive those notifications. We also introduce timezone aware sending with this release, making it even easier to send the right notification at the right time with Knock.</p>
<p><a href="https://knock.app/blog/announcing-schedules-api">Read the announcement —></a></p>
<h2 id="user-content-webhook-channel"><a href="#webhook-channel" tabindex="-1"><span></span></a>Webhook channel</h2>
<p>Webhook channels bring a new level of flexibility and extensibility to Knock’s output layer. You can use webhook channels to notify internal service within your application, or 3rd-party apps such as PagerDuty or Zapier.</p>
<p>The best part of webhook channels is they tie into Knock’s preferences model, so you can surface them to your customers.</p>
<p><a href="https://knock.app/blog/announcing-webhook-channel">Read the announcement —></a></p>
<h2 id="user-content-subscriptions-api"><a href="#subscriptions-api" tabindex="-1"><span></span></a>Subscriptions API</h2>
<p>With subscriptions, you can model lists of users, then notify all users in that list with a single API call.</p>
<p>Subscriptions are a powerful way for you to offload to Knock the responsibility of <strong>who</strong> should be notified. You can use subscriptions to power alerting use cases and publish/subscribe models, or to model the concept of a set of dynamic followers of a resource.</p>
<p><a href="https://knock.app/blog/announcing-subscriptions-api">Read the announcement —></a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[API idempotency support + Knock Translations]]></title>
            <description><![CDATA[Idempotent API requests, notification localization, and more.]]></description>
            <link>https://knock.app/changelog#2023-04-10</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-04-10</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Mon, 10 Apr 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-idempotent-api-requests"><a href="#idempotent-api-requests" tabindex="-1"><span></span></a>Idempotent API requests</h2>
<p>Knock now supports idempotency so that requests can be retried safely without unintended side effects. This release of idempotency is limited to our workflow trigger endpoint. You can know set an idempotency key on your workflow triggers to ensure that Knock doesn't sent duplicate notifications when you retry requests. You can learn more about API idempotency in Knock in <a href="https://docs.knock.app/reference#idempotent-requests">our API reference</a>.</p>
<p>We're powering idempotency in Knock with our new open-source Elixir library for powering idempotency on any API. We're calling it <a href="https://hex.pm/packages/one_and_done">One and Done</a>. 😎 You can learn more about how our One and Done library in <a href="https://knock.app/blog/using-one-and-done-to-power-idempotency">our announcement blog post</a>.</p>
<h2 id="user-content-notification-localization-i18n-support"><a href="#notification-localization-i18n-support" tabindex="-1"><span></span></a>Notification localization (i18n) support</h2>
<p>In case you missed it last week, we just launched Knock Translations, our solution for teams that need to localize their notifications for a global audience. You can learn more in <a href="https://knock.app/blog/announcing-knock-translations">our announcement post</a>.</p>
<h2 id="user-content-angular-in-app-feed-component"><a href="#angular-in-app-feed-component" tabindex="-1"><span></span></a>Angular in-app feed component</h2>
<p>One of our customers wrote a great Angular example of our React in-app feed component. You can find it <a href="https://github.com/knocklabs/angular-in-app-feed-example">here</a>. If you're a team that uses Angular and wants to ship an in-app feed in a few minutes, this is a great way to do so. Shoutout to Knock customer and community member Chris Graves for this one!</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed a bug in our conditions builder where conditions with empty values could not be created.</li>
<li>🐛 We fixed a bug in our fetch step where successful requests that resulted in an empty response would show an error status in the Knock dashboard.</li>
<li>🐛 We fixed a bug where our rate limits were too specifically scoped.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Our new and improved variable pane editor]]></title>
            <description><![CDATA[An improved variable pane editor, better layout management, channel overrides, and more.]]></description>
            <link>https://knock.app/changelog#2023-03-22</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-03-22</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 22 Mar 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-new-json-editor-for-template-preview-data"><a href="#new-json-editor-for-template-preview-data" tabindex="-1"><span></span></a>New JSON editor for template preview data</h2>
<p>Our customers use the variable preview pane to understand which variables a workflow uses in its templates, and to update the values of those variables for use in template previews. Previously, this was managed through a point and click interface, which made it difficult to work with structured data such as lists and objects.</p>
<p>Our new and improved preview data editor lets you work with JSON directly. This means you can copy-paste a sample event payload into the editor and immediately see how it will render in your template. We also handle nested data structures to make it easier to navigate through the lists and objects you're working with in your workflow trigger payloads.</p>
<h2 id="user-content-improved-layout-management"><a href="#improved-layout-management" tabindex="-1"><span></span></a>Improved layout management</h2>
<p>You can now rename, duplicate, and archive the layouts you create in Knock. This enables teams to clean legacy layouts out of Knock and makes it easier to understand which layouts are in active use within the account.</p>
<h2 id="user-content-configure-email-providers-with-json-overrides"><a href="#configure-email-providers-with-json-overrides" tabindex="-1"><span></span></a>Configure email providers with JSON overrides</h2>
<p>You can now configure your email channels in Knock to always pass through JSON data in the requests Knock makes to that channel. As an example, if you're using SendGrid as your email provider and you want to pass through an <code>email_category</code> to SendGrid, you can configure a JSON override on your channel config. These channel overrides support liquid so you can dynamically set this value based on workflow run state if you prefer. See the example below.</p>
<pre><code class="language-javascript">{
  "custom_args": {
    "email_category": "{{ notificationType | default: "TRANSACTIONAL" }}"
  }
}
</code></pre>
<p>You can learn more about configuring channels and JSON provider overrides in <a href="https://docs.knock.app/integrations/email/settings#provider-json-overrides">our docs</a>.</p>
<h2 id="user-content-secret-account-and-environment-variables"><a href="#secret-account-and-environment-variables" tabindex="-1"><span></span></a>Secret account and environment variables</h2>
<p>You can now set your account and environment variables as secrets within Knock. A secret variable is one that will be obfuscated within the Knock dashboard once created. This is helpful for cases where you want to use secret keys as Knock environment variables, e.g. to make calls to downstream systems using the Knock fetch step.</p>
<p>When you're creating a variable, just enable "Set as secret variable".</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 You can now pass a comma-separated list of email addresses to the cc and bcc fields on your email channel configurations.</li>
<li>🐛 We fixed an issue where events coming from sources such as Segment or Rudderstack that had properties with empty lists (<code>[]</code>) may fail to sync.</li>
<li>🐛 We fixed a bug in our preferences set code that would prevent certain nested preferences from overriding previously set preferences for workflows and categories.</li>
<li>🐛 We fixed an issue where creating a new environment could lead to some channel configuration not being set for in-app feeds.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Message status conditions and security enhancements]]></title>
            <description><![CDATA[We've shipped an overhaul of our message status conditions editor, improvements for working with signed user tokens, and another batch of bug fixes.]]></description>
            <link>https://knock.app/changelog#2023-02-24</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-02-24</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 24 Feb 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-an-overhaul-for-message-status-conditions"><a href="#an-overhaul-for-message-status-conditions" tabindex="-1"><span></span></a>An overhaul for message status conditions</h2>
<p>This week we've shipped a major update to message status conditions in the workflow editor. While we have long supported workflow step conditions that evaluate against the status of a preceding notification message, we only ever provided a small set of condition cases.</p>
<p>With this update, we've expanded the set of condition cases available to cover all possible message delivery and engagement statuses. Also included are some validation helpers that will warn you if we detect you've designed a condition that will never evaluate successfully.</p>
<p>This is a fully backwards compatible update—all of your existing message status conditions will continue working as you've come to expect. We're excited about how this update will unlock more powerful, composable control flow for your workflows, especially in combination with <a href="https://docs.knock.app/send-notifications/tracking">Knock open and link tracking</a>.</p>
<p>For more details, visit our <a href="https://docs.knock.app/designing-workflows/step-conditions#message-status-conditions">message status conditions docs</a> or our general guide on <a href="https://docs.knock.app/send-and-manage-data/conditions">Knock conditions</a>.</p>
<h2 id="user-content-enhanced-security-mode-configuration-and-user-token-signing-helpers"><a href="#enhanced-security-mode-configuration-and-user-token-signing-helpers" tabindex="-1"><span></span></a>Enhanced security mode configuration and user token signing helpers</h2>
<p>We're excited to share a couple of developer experience improvements to API security at Knock.</p>
<p>Since the beginning, Knock has required that you include a signed user token in requests to your production environment that use a public API key. Now, you can configure this requirement on a per environment basis. We call this "enhanced security mode", and when enabled we will require those signed user tokens. Existing production environments still have enhanced security mode enabled by default.</p>
<p>We've also made it easier to work with those signed user tokens. When you generate a shared signing key in the Knock Dashboard, we now present the key in base-64 format by default. This can be easier to use within single-line environment variables. The PEM-encoded format is also still available.</p>
<p>The Knock Node SDK now includes a convenience method, <code>Knock.signUserToken()</code>, that will automatically use the <code>KNOCK_SIGNING_KEY</code> environment variable in either base-64 or PEM format to securely sign user IDs for use in your client applications.</p>
<p>Lastly, we've updated our <a href="https://docs.knock.app/in-app-ui/security-and-authentication#authentication-with-enhanced-security">security and authentication guide</a> with more helpful notes on how to work with enhanced security mode.</p>
<p>Head over to the "Developers > API keys" page in the Knock Dashboard to take a look.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 From the workflows list, you can now open a workflow in a new browser tab by <code>cmd + &#x3C;click></code>-ing it.</li>
<li>👀 We shipped a small redesign to the "Integrations > Extensions" management page.</li>
<li>👀 Users with the support role can now access the Knock analytics page.</li>
<li>👀 We added some truncation for lengthy ID and key values across the Knock dashboard.</li>
<li>👀 When setting channel data for a user or object, we now validate that the shape of the channel data you send us is valid for the target channel type.</li>
<li>👀 Within the workflow builder, you can override channel-level Knock tracking config defaults for specific workflow steps. Now, we've added a button that lets you reset your overrides so that your step once again inherits from channel-level defaults.</li>
<li>🐛 We fixed a bug that prevented you from creating a workflow with more than 10 channel steps. You can now create workflows with any number of channel steps.</li>
<li>🐛 We fixed a bug where we wouldn't display environment default preferences in the Knock dashboard after first creating them.</li>
<li>🐛 We fixed some bugs with user invites where duplicate users would exist after a new user accepted an invite and signed up to join a Knock account.</li>
<li>🐛 We fixed a bug where non-visible Liquid statements (e.g. <code>{% if %}</code>) would result in extra, empty <code>&#x3C;p></code> tags when rendering a Markdown template into HTML.</li>
<li>🐛 We fixed a bug where you couldn't set an empty <code>connections</code> list for the channel data for a chat channel for a user or object.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Object subscriptions + Segment extension beta]]></title>
            <description><![CDATA[We've added support for managing lists of recipients in Knock via Object Subscriptions and have built a new Segment extension to send your notifications analytics data to 350+ destinations]]></description>
            <link>https://knock.app/changelog#2023-02-09</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-02-09</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 09 Feb 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-trigger-workflows-to-lists-of-recipients-with-object-subscriptions"><a href="#trigger-workflows-to-lists-of-recipients-with-object-subscriptions" tabindex="-1"><span></span></a>Trigger workflows to lists of recipients with Object Subscriptions</h2>
<p>We're happy to announce that we've added support for object subscriptions to Knock. Object subscriptions make it easy for you to create and manage lists of recipients and trigger notification workflows to all recipients who are subscribed to that list, all from a single API call.</p>
<p>You can use object subscriptions to build pub/sub or alerting features on top of Knock, without the need to manage <em>who</em> should be notified and let Knock handle the efficient fan out of sending notifications to thousands of users simultaneously.</p>
<pre><code class="language-javascript">// Create an object to subscribe recipients to
await knock.objects.set("project_alerts", project.id, {
  name: project.name,
});

// Subscribe one or more users to the alerts
await knock.objects.addSubscriptions("project_alerts", project.id, {
  recipients: ["esattler", "dnedry"],
});

// Trigger a workflow to all recipients subscribed
await knock.workflows.trigger("alerts", {
  recipients: [{ collection: "project_alerts", id: project.id }],
});
</code></pre>
<p>For more details, visit the <a href="https://docs.knock.app/send-and-manage-data/subscriptions">Object subscriptions docs</a>.</p>
<h2 id="user-content-analyze-your-notification-event-data-in-downstream-tools-with-our-segment-extension-beta"><a href="#analyze-your-notification-event-data-in-downstream-tools-with-our-segment-extension-beta" tabindex="-1"><span></span></a>Analyze your notification event data in downstream tools with our Segment extension (beta)</h2>
<p>We're excited to announce that our new Segment extension is now in beta. In just a few clicks you can start sending all of the events associated with the notifications being sent through Knock – clicks, opens, and delivery events – to <a href="https://segment.com/docs/connections/destinations/catalog/index-all/">over 350 destinations</a> available in Segment.</p>
<p>For more details, visit the <a href="https://docs.knock.app/integrations/extensions/segment">Segment extension docs</a>. The Segment extension is available on the Growth and Enterprise plans. You can receive beta access by contacting us at support@knock.app.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We've changed our preferences API so default preferences will always be merged into the preferences shown in the dashboard and via the API for both users and objects</li>
<li>👀 We've extended our support role to include viewing read-only workflows, logs, and workflow runs across all environments</li>
<li>👀 You can now press "cmd + k" to access the search bar on our docs</li>
<li>🐛 We fixed an issue where our user typeahead wouldn't allow you to select a user where there multiple users with the same emails</li>
<li>🐛 We fixed a bug where specifying a sort order on a batch step would not sort the activities in the same order on the <code>/v1/messages/:id/activities</code> API</li>
<li>🐛 We fixed an issue where a malformed piece of JSON in a preview variable could cause the app to crash</li>
<li>🐛 We fixed a small bug where creating a new email layout would not show up under the "Manage template settings" when selecting a custom layout</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Resend + Knock]]></title>
            <description><![CDATA[We're excited to announce that you can now use Resend as an email provider with Knock.]]></description>
            <link>https://knock.app/changelog#2023-02-02</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-02-02</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 02 Feb 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-resend--knock"><a href="#resend--knock" tabindex="-1"><span></span></a>Resend + Knock</h2>
<p>We're super excited to announce that we now support <a href="https://resend.com/">Resend</a> as an email provider with Knock. Now you can send great-looking emails through Resend's email API, while orchestrating your multi-channel notifications with Knock.</p>
<p>We're a big fan of the Resend team and of modern developer tooling in general, so we're excited to be able to extend their API to Knock customers everywhere. Happy (re)sending!</p>
<p><a href="https://docs.knock.app/integrations/email/resend">Read more in our docs</a></p>
<h2 id="user-content-an-improved-user-search-component-find-by-id-or-email"><a href="#an-improved-user-search-component-find-by-id-or-email" tabindex="-1"><span></span></a>An improved user search component: find by ID or email</h2>
<p>This improvement is a long time coming. We've improved our user search component in a big way. Now when you're in the Knock test runner, you can search for recipients and actors by either their user ID or their email. This makes it <em>much</em> easier to quickly find the recipient you're looking for and send them a test notification.</p>
<p>We've updated all of our other user search experiences (across messages, logs, and workflow runs) to use this new behavior, too. This makes it easier for your support team to quickly find the Knock logs associated with a particular user.</p>
<h2 id="user-content-new-and-improved-template-editor-design"><a href="#new-and-improved-template-editor-design" tabindex="-1"><span></span></a>New and improved template editor design</h2>
<p>We've added some visual polish to our template editor. It helps with general spacing and readability. We've also added new breadcrumbs to the template editor to make it easier to see where you are in Knock and to quickly return to your workflow canvas.</p>
<h2 id="user-content-new-undelivered-status-with-outbound-webhook-support"><a href="#new-undelivered-status-with-outbound-webhook-support" tabindex="-1"><span></span></a>New undelivered status with outbound webhook support</h2>
<p>Our <a href="https://docs.knock.app/send-and-manage-data/outbound-webhooks">outbound webhooks</a> are a popular way for our customers to stay updated on what's happening in their Knock system and to trigger behavior in their own application based on Knock events.</p>
<p>Previously our <code>message.undelivered</code> webhook would fire with each delivery attempt we made to your downstream notification providers. Now we have two separate webhooks, one for our delivery attempts to your providers (<code>message.delivery_attempted</code>) and one for when delivery has failed and no more attempts will be made (<code>message.undelivered</code>).</p>
<p>This makes it easier to trigger behavior in your application based on undelivered notifications.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We've added a <code>workflow</code> tag to our <a href="https://docs.knock.app/integrations/extensions/datadog">datadog metrics</a></li>
<li>👀 We've made some performance improvements to our analytics views in the Knock dashboard</li>
<li>👀 We improved our error messaging when sending a <code>null</code>, <code>undefined</code>, or empty API key into Knock</li>
<li>🐛 We fixed an issue where email fields with liquid would fail on downstream providers when resolving to an empty string</li>
<li>🐛 We fixed an issue where conditions with arguments that resolved to strings containing periods could cause errors when evaluating some conditions</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Protect customer data with per-environment obfuscation controls]]></title>
            <description><![CDATA[Work with customer notification in the Knock dashboard while obfuscating PII and customer data from your team.]]></description>
            <link>https://knock.app/changelog#2023-01-25</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-01-25</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 25 Jan 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-protect-customer-data-with-dashboard-obfuscation-controls"><a href="#protect-customer-data-with-dashboard-obfuscation-controls" tabindex="-1"><span></span></a>Protect customer data with dashboard obfuscation controls</h2>
<p>Today we're announcing that all Knock customers can use the customer data controls we first announced as part of <a href="https://knock.app/blog/hipaa-announcement">Knock HIPAA compliance</a>. With this release, you can obfuscate customer data within the Knock dashboard while still giving your team the ability to debug your notification system as needed. These controls can be enabled on a per-environment basis, enabling you to secure customer data in production while continuing to work the way you want in your internal-only development environments.</p>
<p>One of our foundational product principles at Knock is developer visibility. We want you to be able to observe the Knock notification system and debug potential issues, just as you would with an in-house notification system. But with great visibility comes great responsibility. With this release, you can continue to debug your notification system with the confidence that your customers' production data is protected, even from your internal team.</p>
<p>You can enable customer data obfuscation by going to "Settings > Environments", and then clicking "Edit environment".</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added a new filters section to workflow logs to filter by request ID and status of the requests</li>
<li>👀 We improved our conditions handling for comparing <code>null</code> values with <code>></code> and <code>&#x3C;</code> operators so a comparison always returns <code>false</code></li>
<li>🐛 We patched an issue where API logs with large lists would never appear in the API log debugger</li>
<li>🐛 We added a fix for batching where a workflow run with a batch could display as having an error, even after it has succeeded</li>
<li>🐛 We fixed an issue where default preference sets could incorrectly return the wrong preferences when a tenant was specified but there was no corresponding user-tenant preference set.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Build custom feed filters, view workflow runs, and more]]></title>
            <description><![CDATA[Build custom filters into your Knock feeds that filter notifications based on custom metadata.]]></description>
            <link>https://knock.app/changelog#2023-01-05</link>
            <guid isPermaLink="false">https://knock.app/changelog#2023-01-05</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 05 Jan 2023 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-build-custom-feed-filters-using-notification-metadata"><a href="#build-custom-feed-filters-using-notification-metadata" tabindex="-1"><span></span></a>Build custom feed filters using notification metadata</h2>
<p>Most notification feeds share a common set of built-in filters, usually a combination of filter by seen, read, or archival status. But as customers have used our real-time feed infrastructure to build for different use cases (such as inboxes and task centers) they've asked for the ability to introduce custom filters into the notification experiences they build with Knock. Now they can.</p>
<p>With today's release you can filter our feed and message endpoints by any of the data you pass to Knock in your workflow trigger payloads. This means you can introduce any type of filter into your feed experiences, whether that's by completion status (e.g. for task centers), by approver (for approval workflows), or by any other key you can think of. We're super excited about the flexibility this brings to building in-app UI with Knock and the use cases you can power using it.</p>
<p>This feature is now available for all customers across all of our SDKs. You can learn more in <a href="https://docs.knock.app/reference#get-feed">our docs</a>. Let us know what feedback you have!</p>
<h2 id="user-content-view-per-user-workflow-runs-in-a-single-place"><a href="#view-per-user-workflow-runs-in-a-single-place" tabindex="-1"><span></span></a>View per-user workflow runs in a single place</h2>
<p>Knock already has multiple views into our workflow engine to help developers understand how their API calls to Knock lead to messages sent to customers. But for support and operations teams, these logs aren't always intuitive to parse when you're looking to find all the workflow runs generated for a given recipient.</p>
<p>Today we're launching a new workflow runs view that shows you exactly that. The workflow runs view shows you all workflow runs generated for a given workflow, so you can easily see which workflows were triggered for a given recipient and the messages that were generated as a result. This makes it even easier for everyone on your team to see into the Knock notification engine and to understand how it's messaging customers.</p>
<p>You can find the new workflow runs view in the workflow runs tab under a given workflow's page or under the "logs" page if you want to see all workflow runs within a given environment. You can also filter by a number of properties to find the exact workflow runs you're looking for.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added an expanded version of the popover message template editor</li>
<li>🐛 We fixed a cursor display issue on our popover message template editor</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Link tracking & Datadog extension]]></title>
            <description><![CDATA[Track links & opens across channels, and get detailed Knock metrics sent to Datadog]]></description>
            <link>https://knock.app/changelog#2022-12-22</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-12-22</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 22 Dec 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-manage-open-and-link-tracking-with-knock-beta"><a href="#manage-open-and-link-tracking-with-knock-beta" tabindex="-1"><span></span></a>Manage open and link tracking with Knock (beta)</h2>
<p>Today we’re launching beta support for native link and open tracking within our email, SMS, chat, and in-app channels giving you unprecedented visibility into the cross-channel notifications you’re sending. Previously we had relied on downstream message senders to handle link and open tracking, but bringing this natively into Knock means that you’ll be able to see analytics relating to all types of messages in a single place.</p>
<p>For more details, visit the <a href="https://docs.knock.app/send-notifications/tracking">link and open tracking docs</a>.</p>
<p>Want to sign up for the beta? Let us know.</p>
<h2 id="user-content-monitor-your-knock-notifications-with-our-datadog-extension-beta"><a href="#monitor-your-knock-notifications-with-our-datadog-extension-beta" tabindex="-1"><span></span></a>Monitor your Knock notifications with our Datadog extension (beta)</h2>
<p>We are proud to introduce the Knock Datadog extension! In just a few clicks, you can publish a stream of metrics straight from Knock to your Datadog account. These metrics can then power Datadog dashboards, alerts, and troubleshooting. Now it is easier than ever for teams to detect and respond to issues with misconfigured channels, expired credentials, changes in authorization, or downstream issues with Knock itself.</p>
<p>Although Knock engineers monitor and respond to our own suite of alarms, reports, and metrics around the clock already, the new Datadog extension offers additional peace of mind to teams with high operational or compliance requirements.</p>
<p>For more details, visit the <a href="https://docs.knock.app/integrations/extensions/datadog">Datadog extension docs</a>.</p>
<p>Want to sign up for the beta? Let us know.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We made template previews more closely mirror what is actually delivered across SMS, chat, and in-app channels</li>
<li>🐛 We sped up queries for API and workflow logs</li>
<li>🐛 We fixed an issue where overrides could cause FCM notifications to error</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Template localization + account auto-join]]></title>
            <description><![CDATA[Power internationalization for your product notifications and enable members of your organization to auto-join your account.]]></description>
            <link>https://knock.app/changelog#2022-12-07</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-12-07</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 07 Dec 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-power-notification-localization-with-knock"><a href="#power-notification-localization-with-knock" tabindex="-1"><span></span></a>Power notification localization with Knock</h2>
<p>Today we’re <em>super</em> excited to announce the beta release of Knock template localization. With template localization you can use the notification templates you already send with Knock to create locale-specific variants for users that prefer to receive their notifications in a different language. This helps meet your users where they are and improve the notification experience of your product.</p>
<p>Let’s say you have a welcome notification workflow that sends new users an in-app message and an email. For each of those notification templates, you can create a variant that's localized based on each recipient's locale. At runtime Knock uses the <code>locale</code> property on your recipient to determine which language variant of your notification should be sent. We also provide a "default" template that's used for any recipients whose <code>locale</code> isn't supported.</p>
<p>Another great thing about today’s release: though we built template variants for localization use cases, you can use your own custom logic and expressions to power any template variant use case you can dream up. For example, if you wanted to send a tenant-specific variant of a given notification template, you could power it with Knock template variants.</p>
<p>You can learn more about template localization in <a href="https://docs.knock.app/designing-workflows/template-editor#using-template-variants">our documentation</a> and request beta access by sending us a note at <a href="mailto:support@knock.app">support@knock.app</a>.</p>
<h2 id="user-content-enable-auto-join-for-your-knock-account"><a href="#enable-auto-join-for-your-knock-account" tabindex="-1"><span></span></a>Enable auto-join for your Knock account</h2>
<p>If you're a Knock account owner, as of today you can enable auto-join for users from your domain. A quick example: if you're the Knock admin for your company Collab.io, once you enable auto-join any verified users with a “collab.io” email address can join your account.</p>
<p>This is a win for admins and end users alike. If you're an admin, enabling auto-join means (i) less time spend managing account invites and (ii) a safeguard against users from your domain accidentally creating their own account when they should be working in yours. If you're an end user, it means you can get into the right account for your organization when first signing up for Knock.</p>
<p>You can learn more about enabling auto-join in <a href="https://docs.knock.app/manage-your-account/managing-members#enabling-auto-join-for-your-account">our docs</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed a bug where template previews weren't honoring brand defaults.</li>
<li>🐛 We fixed a bug where activities under a message weren't paginating on the feed API.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Inline channel data and preferences, plus new condition builder updates]]></title>
            <description><![CDATA[Introducing support for setting inline channel data and preferences, and improvements to our conditions builder]]></description>
            <link>https://knock.app/changelog#2022-12-02</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-12-02</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 02 Dec 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-set-inline-channel-data-and-preferences"><a href="#set-inline-channel-data-and-preferences" tabindex="-1"><span></span></a>Set inline channel data and preferences</h2>
<p>We've expanded our workflow trigger inline identify to support setting channel data and preferences for recipients. That means it's now easier than ever to start sending notifications to your users with Knock, without the need to backfill existing data. It even works for setting data for multiple channels and for <a href="https://docs.knock.app/send-notifications/setting-preferences#setting-per-tenant-preference-sets">per-tenant preferences</a> too.</p>
<p>Read more on <a href="https://docs.knock.app/send-notifications/setting-channel-data">setting channel data inline</a> and <a href="https://docs.knock.app/send-notifications/setting-preferences#setting-preferences-inline-during-a-workflow-trigger">setting preferences inline</a> in our documentation.</p>
<h2 id="user-content-conditions-builder-improvements"><a href="#conditions-builder-improvements" tabindex="-1"><span></span></a>Conditions builder improvements</h2>
<p>We've added a whole host of new features to our step and channel conditions builder this month. You can now reference:</p>
<ul>
<li>Environment variables (e.g. skip this step if we're in the <code>development</code> environment)</li>
<li>Workflow run state including <code>total_activities</code> and <code>total_actors</code> (e.g. only execute the step if we have more than one item from a batch)</li>
<li>The current <code>tenant</code> (e.g. only batch for workspace X and never for workspace Y)</li>
<li>The current <code>workflow</code> (e.g. only send to SMS if the workflow category includes <code>messages</code>)</li>
</ul>
<p><a href="https://docs.knock.app/send-notifications/designing-workflows/trigger-conditions">Read more in our docs.</a></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We expanded the delay block to support <a href="https://docs.knock.app/designing-workflows/delay-function#wait-for-a-dynamic-duration">dynamic delays from the recipient, actor, environment and more</a></li>
<li>👀 We added the ability to reference the <code>current_message.id</code> in your notification templates to get access to the unique, recipient-specific <code>message.id</code></li>
<li>👀 We moved 'Designing workflows' to its own section <a href="https://docs.knock.app/designing-workflows">in the documentation</a></li>
<li>👀 We made improvements to our email previews to be more consistent with what's sent</li>
<li>🐛 We fixed an issue where JSON values in chat templates would not escape <code>\n</code> and <code>\</code> characters correctly</li>
<li>🐛 We fixed a bug with mailgun delivery checks where the requests would timeout after 5+ seconds</li>
<li>🐛 We fixed an issue where some starter plans could not create a new webhook</li>
<li>🐛 We fixed a bug where blank in-app feed messages would fail to send</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Per-environment channel conditions and setting batch order]]></title>
            <description><![CDATA[Introducing per-environment channel conditions and setting batch order]]></description>
            <link>https://knock.app/changelog#2022-11-07</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-11-07</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Mon, 07 Nov 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-per-environment-channel-conditions"><a href="#per-environment-channel-conditions" tabindex="-1"><span></span></a>Per-environment channel conditions</h2>
<p>By popular demand, we’ve brought our condition builder to your per-environment channel configurations. Channel-level conditions are helpful when you want to add a condition to all instances of a channel in a given environment.</p>
<p>An example: let’s say you want to ensure that your email channel will only send notifications to recipients whose email ends in <a href="http://knock.app">knock.app</a> from your development and staging environments. Now you can.</p>
<p>We surface all channel-conditions on their relevant workflow-level steps and in the Knock debugger, so you’ll always have visibility into why a given notification is or isn’t sending.</p>
<p><a href="https://docs.knock.app/send-notifications/designing-workflows/trigger-conditions">Read more in our docs</a></p>
<h2 id="user-content-set-batch-order-first-or-last-ten-items"><a href="#set-batch-order-first-or-last-ten-items" tabindex="-1"><span></span></a>Set batch order: first or last ten items</h2>
<p>We’ve updated our batch function to include a new batch order setting. This enables you to set whether a batch function will include the full activity objects for the first or last ten activities aggregated by your batch function.</p>
<p>As a reminder, the Knock batch function will always return its total count of items and unique actors, but only returns full details for ten items in the batch for the purposes of listing out batch details in a notification (as we are in the example notification below).</p>
<p><a href="https://docs.knock.app/send-notifications/designing-workflows/batch-function">Read more in our docs</a></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We redesigned the workflow builder</li>
<li>👀 Added color labels for environments</li>
<li>👀 Now you can commit on your workflow from the workflow builder page</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[WhatsApp provider and a new Vercel integration]]></title>
            <description><![CDATA[Introducing support for WhatsApp, a brand new Vercel integration, and more.]]></description>
            <link>https://knock.app/changelog#2022-10-28</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-10-28</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 28 Oct 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-send-whatsapp-notifications-with-knock"><a href="#send-whatsapp-notifications-with-knock" tabindex="-1"><span></span></a>Send WhatsApp notifications with Knock</h2>
<p>You can now send notifications from Knock to your users on <a href="https://whatsapp.com">WhatsApp</a>, the popular chat app from Meta. Our integration makes it easy to include WhatsApp in your notifications strategy, opening up another channel for you to reach your users where they are.</p>
<p><a href="https://docs.knock.app/integrations/chat/whatsapp">Read more in our docs</a></p>
<h2 id="user-content-vercel-integration"><a href="#vercel-integration" tabindex="-1"><span></span></a>Vercel integration</h2>
<p>We've shipped a new Vercel integration to make it easy for you to set up Knock for your Vercel projects. The integration will link your Knock API keys to your selected Vercel projects and keep them in sync for you.</p>
<p>You can find us in the <a href="https://vercel.com/integrations/knock">Vercel integrations marketplace</a> in the "messaging" category and read more <a href="https://docs.knock.app/integrations/vercel">in our documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 [SDKs] We added new event types to our <code>@knocklabs/client</code> library in <code>0.8.13</code></li>
<li>👀 [SDKs] We added experimental support for cross-browser context feed synchronization in our <code>@knocklabs/client</code> library in <code>0.8.13</code> via the new <code>__experimentalCrossBrowserUpdates</code> option</li>
<li>👀 We redesigned our trigger conditions editor to be an inline form instead of a modal</li>
<li>👀 We added a link to the workflow invoked from a source event action</li>
<li>🐛 We fixed an issue where pagination for tenant messages was not working correctly</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Workflow condition UX improvements and push overrides]]></title>
            <description><![CDATA[Improved experience when working with step trigger conditions and add JSON overrides to your push channel payloads]]></description>
            <link>https://knock.app/changelog#2022-10-14</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-10-14</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 14 Oct 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-workflow-condition-ux-improvements"><a href="#workflow-condition-ux-improvements" tabindex="-1"><span></span></a>Workflow condition UX improvements</h2>
<p>At Knock, we continually strive to improve the experience our users have building their notification workflows.
As of this release, it's much easier to understand at a glance which workflow steps contain conditions and how
those conditions will execute based on the variable state of a given workflow run.
To see a step's conditions, just hover over its card chin to see a hover over preview of all condition groups present on the step. ✨</p>
<h2 id="user-content-push-channel-json-overrides"><a href="#push-channel-json-overrides" tabindex="-1"><span></span></a>Push channel JSON overrides</h2>
<p>We now support the ability to add JSON overrides to the notification payloads Knock sends to downstream push channels on your behalf. This means you can now support badge counts, extra data properties, sound files, and other provider-specific settings in your push notifications. You can learn more in our <a href="https://docs.knock.app/integrations/push/overview">push channel documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 Show canceled request id in debugger</li>
<li>👀 Show delay until values in debugger for steps that support it</li>
<li>👀 Support liquid variables in email templates footer links</li>
<li>👀 Add tenant brand icons on dashboard</li>
<li>👀 Display custom step names on workflow cards</li>
<li>🐛 Fix SSO login using Okta tiles</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Integrate event and customer data platforms into Knock]]></title>
            <description><![CDATA[Announcing support for Segment and Rudderstack integrations with Knock]]></description>
            <link>https://knock.app/changelog#2022-09-28</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-09-28</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 28 Sep 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-power-your-product-notifications-with-segment-and-rudderstack"><a href="#power-your-product-notifications-with-segment-and-rudderstack" tabindex="-1"><span></span></a>Power your product notifications with Segment and Rudderstack</h2>
<p>Now you can integrate customer data platforms (CDPs) such as <a href="https://segment.com">Segment</a> and <a href="https://rudderstack.com">Rudderstack</a> with Knock to power your product notifications. This means that you can use the identify and track calls you already send to your CDP to identify users in Knock and send them notifications.</p>
<ul>
<li><code>track</code> events can trigger Knock workflows, with custom mapping from event properties into every part of triggering a workflow</li>
<li><code>identify</code> events keep user information in sync with Knock, so that user changes like email updates are fully synchronized with Knock with no code changes required in your product</li>
</ul>
<p>Here's what this unlocks for your team. If you're a product manager that wants to set up a new notification type without taking time from your engineering team, you can create a new notification workflow in Knock and trigger it when Knock receives an event from your CDP. You can map properties from your event into your notification template to personalize messages, and into other parts of your notification workflow to power recipients, tenants, and more.</p>
<p><a href="https://docs.knock.app/integrations/sources/overview">Check out our integrations overview</a> to get started, or dive into our docs for <a href="https://docs.knock.app/integrations/sources/segment">Segment</a> or <a href="https://docs.knock.app/integrations/sources/rudderstack">Rudderstack</a>.</p>
<p>This is just the start of powering Knock with external sources. We have more providers on the way, including reverse ETL platforms such as Hightouch and Census. If there's a specific event or customer data platform you'd like to see us support, please <a href="mailto:support@knock.app">get in touch</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added the ability to update the number of activities in a batch from the variable pane – very helpful when working with batch data.</li>
<li>🐛 We fixed a bug with our account invitations whereby a user without a name would cause invites to be returned as "not found".</li>
<li>🐛 We fixed an issue where editing an email template could crash the dashboard for a small number of users.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New Email + SMS providers and SAML SSO]]></title>
            <description><![CDATA[Announcing support for 8 new providers and SAML 2.0 SSO for Growth + Enterprise plans]]></description>
            <link>https://knock.app/changelog#2022-09-22</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-09-22</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 22 Sep 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-new-email--sms-channel-providers"><a href="#new-email--sms-channel-providers" tabindex="-1"><span></span></a>New Email + SMS channel providers</h2>
<p>We're rolling out a whole host of new email and SMS channel providers today, available now under the "Channels" section in your account dashboard.</p>
<p><strong>Email providers</strong></p>
<ul>
<li><a href="/integrations/sparkpost-email-notifications">Sparkpost</a></li>
<li><a href="/integrations/mandrill-email-notifications">Mandrill</a></li>
<li><a href="/integrations/mailersend-email-notifications">Mailersend</a></li>
</ul>
<p><strong>SMS providers</strong></p>
<ul>
<li><a href="/integrations/messagebird-sms-notifications">MessageBird</a></li>
<li><a href="/integrations/africas-talking-sms-notifications">Africa's Talking</a></li>
<li><a href="/integrations/mailersend-sms-notifications">Mailersend</a></li>
<li><a href="/integrations/sinch-sms-notifications">Sinch</a></li>
<li><a href="/integrations/vonage-sms-notifications">Vonage</a></li>
</ul>
<p>If you need a specific provider not covered in our <a href="/integrations">current providers list</a>, please <a href="mailto:support@knock.app">get in touch</a>.</p>
<h2 id="user-content-saml-20-sso-support"><a href="#saml-20-sso-support" tabindex="-1"><span></span></a>SAML 2.0 SSO Support</h2>
<p>If you use SAML 2.0 SSO to manage authentication into the apps used by your organization, you can now configure your Knock account to enable users to authenticate into your account using your identity provider via SSO.</p>
<p>Note: SAML SSO is only available on our <a href="https://knock.app/pricing">Growth and Enterprise plans</a>.</p>
<p><a href="https://docs.knock.app/manage-your-account/saml-sso">Learn more about SSO</a></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We made some visual improvements to the variable pane in the workflow builder, making it easier to work with batched data like <code>activities</code> and <code>actors</code></li>
<li>👀 We now trim whitespace from email subject lines automatically, making it easier to work with</li>
<li>👀 We made some internal improvements to our feeds endpoint, reducing the response time by 86%</li>
<li>🐛 We now correctly support <code>.first</code>, <code>.last</code>, and <code>.size</code> calls on arrays in liquid</li>
<li>🐛 We fixed an issue where changing template overrides would reset the editor contents within the email template editor</li>
<li>🐛 We added more spacing around items in our visual email editor to work more easily on smaller screens</li>
<li>🐛 We fixed an issue where message sending logs weren't appearing</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Per-tenant default preferences]]></title>
            <description><![CDATA[Enable your customers to set account-wide preferences for their account members.]]></description>
            <link>https://knock.app/changelog#2022-09-01</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-09-01</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 01 Sep 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-enable-your-customers-to-set-account-wide-default-preferences"><a href="#enable-your-customers-to-set-account-wide-default-preferences" tabindex="-1"><span></span></a>Enable your customers to set account-wide default preferences</h2>
<p>Today we're releasing <a href="https://docs.knock.app/send-and-manage-data/preferences#per-tenant-preference-defaults">per-tenant default preferences</a>. When your product starts moving into larger organizations, you can often find admins asking for the ability to set a notification preference for all users in their account (or to set a default preference for those users at a minimum.)</p>
<p>Now you can support these types of per-tenant preference use cases with Knock. Our tenant preference model brings the same flexibility as our per-user preferences and lets you put them into the hands of your customers' admins.</p>
<p><a href="https://docs.knock.app/send-and-manage-data/preferences#per-tenant-preference-defaults">Learn more about per-tenant preferences</a></p>
<h2 id="user-content-set-pre-content-variables-in-your-email-layout"><a href="#set-pre-content-variables-in-your-email-layout" tabindex="-1"><span></span></a>Set pre-content variables in your email layout</h2>
<p>Now you can set variables in your email template that will be rendered in your email layout ahead of your <code>content</code> block. This is great for when you want to set dynamic email preview text or dynamic header content within the layout of your email.</p>
<p><a href="https://docs.knock.app/integrations/email/layouts#defining-pre-content-variables">Learn more about pre-content variables</a></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed a bug in our test runner where our typeahead select fields were acting finicky.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Roles and permissions, and dark mode docs]]></title>
            <description><![CDATA[A new set of account member roles, dark mode docs, and more!]]></description>
            <link>https://knock.app/changelog#2022-08-18</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-08-18</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 18 Aug 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-introducing-role-based-access-control"><a href="#introducing-role-based-access-control" tabindex="-1"><span></span></a>Introducing role-based access control</h2>
<p>Today we’re shipping a new set of account-level roles for the Knock dashboard, making it easy to grant more tailored permissions to members of your team who might not need full access to all resources within your Knock account.</p>
<p>The roles now available on your account are:</p>
<ul>
<li><strong>Owner</strong>: For your primary admin who manages billing. This role can invite and manage members, manage billing, and do anything available in the admin role. Your account must always have at least one account owner.</li>
<li><strong>Admin</strong>: For admins who need to manage account-level settings. This role can invite and manage members (excluding owner and billing roles), manage account branding, manage environments, and manage advanced developer concepts such as signing keys, variables, and webhooks. This role has all permissions available to the member role.</li>
<li><strong>Member</strong>: For users who are editing notification workflows and templates in Knock. This role can manage workflows, layouts, users, objects, and tenants. Users with this role can make commits and push changes to subsequent environments, and has full access to message and API logs for debugging.</li>
<li><strong>Support</strong>: For users who shouldn't have access to workflows and templates, but should be able to dig into message and API logs for debugging purposes.</li>
<li><strong>Billing</strong>: For account members who shouldn't have access to anything in Knock but billing.</li>
</ul>
<p>You can see the full breakdown of the permissions available to each role <a href="https://docs.knock.app/manage-your-account/roles-and-permissions#roles-and-permissions-lookup-table">in the documentation</a>.</p>
<p>These new roles are available to all plans today. You can change roles and manage the members of your account from the "Account Settings > Members" page. As a reminder, there are no limits on the number of seats you can have assigned within your Knock account.</p>
<p><a href="https://docs.knock.app/manage-your-account/roles-and-permissions">Read the documentation →</a></p>
<h2 id="user-content-dark-mode-docs-"><a href="#dark-mode-docs-" tabindex="-1"><span></span></a>Dark mode docs 🌚</h2>
<p><a href="https://docs.knock.app">Our documentation</a> is now available in <strong>dark mode</strong> for all those night owls out there. You can toggle to dark mode in the top header from any page in the docs.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed an edge-case with our batching function whereby in a set of very specific circumstances a batch could be created twice for a workflow run</li>
<li>👀 We added a new section to the docs for "Managing your account" including information about <a href="https://docs.knock.app/manage-your-account/audit-logs">audit logs</a> and <a href="https://docs.knock.app/manage-your-account/managing-members">managing team members</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The fetch function test runner]]></title>
            <description><![CDATA[A new realtime test runner for the fetch function, per-environment default preference sets, and more!]]></description>
            <link>https://knock.app/changelog#2022-08-10</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-08-10</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 10 Aug 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="test-your-fetch-functions-in-realtime-from-the-template-editor">Test your fetch functions in realtime from the template editor</h2>
<p>A couple weeks ago, <a href="/changelog/2022-07-26">we launched the fetch function</a> for Knock workflows. Today, we're making it a lot easier to develop this function step with a realtime test runner purpose-built for fetch functions.</p>
<p>When you load the template editor, you should now see the new "Test console" in the lower half of the screen along with a "Send test" button next to the URL field. When you run a fetch function test, Knock will execute your fetch step in isolation, ignoring any steps before or after in your workflow. When the step has finished, Knock will load the result into the test console for your review in realtime with no need for a refresh!</p>
<p><video controls muted><source src="/assets/changelog/http_step_test_runner.mp4" type="video/mp4" /></video></p>
<p>We're always working to provide a great developer experience for everyone building with the Knock platform. With this new test runner, the develop ↔ debug cycle for fetch functions just got a great boost.</p>
<p>Check out the <a href="https://docs.knock.app/send-notifications/designing-workflows/fetch-function#testing-fetch-functions">guide on testing fetch functions</a> for more details, or head to the template editor now to try it out.</p>
<h2 id="set-shared-preference-sets-for-all-users-and-objects-in-an-environment">Set shared preference sets for all users and objects in an environment</h2>
<p>We built <a href="https://docs.knock.app/send-and-manage-data/preferences">preference sets</a> in Knock to allow you to configure granular channel and workflow preferences on a per-user and per-object basis. Preference sets serve as a flexible tool to manage things like user-owned credentials and opt-in configurations.</p>
<p>But sometimes you may find you want to set preferences shared across all users and objects in your account. Today we're making that much easier with default preference sets!</p>
<p>You can now navigate to the new "Developers > Defaults" page, where you can configure a preference set that will be global to an entire Knock environment. When Knock loads the preferences for a recipient, it will merge the recipient's owned preferences into the global defaults. User and object preferences will still take precedence, but now you can manage shared preferences in a single space.</p>
<h2 id="fixes-and-improvements">Fixes and improvements</h2>
<ul>
<li>🐛 We fixed a bug that would prevent users in a small set of cases from saving a channel or fetch function template without a page reload.</li>
<li>🐛 We fixed an issue where category preferences required all categories on a workflow to be opted-out before we considered the preference as opted-out.</li>
<li>🐛 We fixed an issue where setting conditions for channel-type preferences would result in a <code>422 Unprocessable Entity</code> error from the Knock API.</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Audit logs]]></title>
            <description><![CDATA[Announcing audit logs in the dashboard and more!]]></description>
            <link>https://knock.app/changelog#2022-08-04</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-08-04</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 04 Aug 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-audit-logs"><a href="#audit-logs" tabindex="-1"><span></span></a>Audit logs</h2>
<p>We've designed our service with security best practices in mind from day one. Audit logs form an important part of the security and compliance program within an organization, making it easy to proactively monitor for suspicious activity and retroactively understand the impact of a malicious actor. For this reason, we've always captured detailed logs of the actions happening across your account. Today we're pleased to announce that we're shipping support for viewing these audit logs from within the Knock dashboard.</p>
<p>With this initial release you'll see information about all of the actions occurring within Knock with detail about the team member who performed the action and additional context about which resource has been modified. You can even filter to an individual team member or a specific type of action if you need to get more granular.</p>
<p>Audit logs are available now <strong>across all plans</strong> and have the same retention period as other logs on your account. You'll find your audit logs under the "Settings" page.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We separated out the "API Keys" and "Variables" section from under the "Developers" page to make them easier to find in the dashboard</li>
<li>🌱 You can now select a preference set to view under a user or object, making it much easier to work with multiple preference sets</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing the fetch function]]></title>
            <description><![CDATA[The fetch function step, trigger conditions expansion, performance tuning for API logs, and more!]]></description>
            <link>https://knock.app/changelog#2022-07-26</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-07-26</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 26 Jul 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-fetch-additional-data-as-a-workflow-step"><a href="#fetch-additional-data-as-a-workflow-step" tabindex="-1"><span></span></a>Fetch additional data as a workflow step</h2>
<p>Today we're shipping a new function step to the Knock workflow builder: the fetch function. With the fetch function, you can build and execute HTTP requests to any external service as a step in your workflows. Knock will merge any data returned to a fetch step request into the global state for the workflow run, thus making it accessible <em>to all templates in subsequent workflow steps</em>!</p>
<p>You can use fetch functions to grab data for a workflow run that may not be readily available at the time you trigger a workflow, such as for workflows that use <a href="https://docs.knock.app/send-notifications/designing-workflows/batch-function">batching</a> to create large activity groups. You can even use fetch functions to trigger side effects in your external systems as Knock processes a workflow run.</p>
<p>Our goal is to ensure Knock serves as many possible notification use-cases with a dead-simple interface. The fetch function adds even more flexibility to Knock and unlocks some neat ways to compose workflows.</p>
<p>Check out the new <a href="https://docs.knock.app/send-notifications/designing-workflows/fetch-function">guide on fetch functions</a> or head to the workflow editor now to get started with fetch functions in your workflows.</p>
<h2 id="user-content-trigger-conditions-for-all"><a href="#trigger-conditions-for-all" tabindex="-1"><span></span></a>Trigger conditions for all</h2>
<p>Trigger conditions, previously only available for channel steps, are now available for use in all workflow steps. As part of this expansion, we've also added a brand new <a href="https://docs.knock.app/send-notifications/designing-workflows/trigger-conditions">guide on trigger conditions</a> to the Knock docs.</p>
<p>Trigger conditions allow you to specify if a given step will execute at workflow execution time. They are one of the many ways you can build powerful logical notification flows with Knock.</p>
<p>With this update trigger conditions are now even more powerful and easier to use.</p>
<h2 id="user-content-performance-tuning-for-our-api-logs"><a href="#performance-tuning-for-our-api-logs" tabindex="-1"><span></span></a>Performance tuning for our API logs</h2>
<p>We've seen recently that it could take a long time (several seconds for our largest customers) to load the list of API logs in Knock. So we invested some time to dig in and address the issue. We found that both the structure of the query used to load the logs and the primary database index used to filter the query had a number of optimization opportunities.</p>
<p>After implementing the necessary changes, we've observed a substantial decrease in query time. For our largest customers, we've seen average query execution times decrease from from 12 seconds to 15 milliseconds!</p>
<p>Our API logs are an important part of the developer experience within Knock, and with this release we're ensuring that they feel performant at any scale.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 We've added a UI for channel preferences to the user and object preferences tabs, including the ability to toggle a channel on/off from the Knock admin.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Custom branding per-tenant]]></title>
            <description><![CDATA[Per-tenant branding and supporting ExternalID in AWS SES]]></description>
            <link>https://knock.app/changelog#2022-07-14</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-07-14</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 14 Jul 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-give-your-customers-control-of-notification-branding"><a href="#give-your-customers-control-of-notification-branding" tabindex="-1"><span></span></a>Give your customers control of notification branding</h2>
<p>You can already use Knock to create branded notifications that put your brand’s best foot forward when you’re communicating with your customers. Now, with today’s per-tenant branding launch, you can extend that same functionality to your own customers.</p>
<p>With per-tenant branding you can set per-tenant overrides for any of the brand elements you already use in your Knock notifications, such as logo, icon, and brand color.</p>
<p>Here’s what this unlocks. If you have an enterprise customer that wants emails from your product to fit their branding (for example in the case they use your product to collaborate with their own customers or vendors), you can now do so with Knock. If custom branding hasn’t been set for a tenant in your application, we fall back to the default branding you set in account settings.</p>
<p>If you're interested in enabling this feature for your account, you can <a href="https://docs.knock.app/send-and-manage-data/tenants">check out the docs</a> and connect with us at <a href="mailto:support@knock.app">support@knock.app</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added support for connecting to AWS SES with an <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html">external ID</a> instead of an access key and secret – <a href="mailto:support@knock.app">please get in touch</a> if you'd like this feature enabled on your account!</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Java SDK]]></title>
            <description><![CDATA[A freshly brewed new SDK ☕️, and a set of fixes]]></description>
            <link>https://knock.app/changelog#2022-07-08</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-07-08</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 08 Jul 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-java-sdk-️"><a href="#java-sdk-%EF%B8%8F" tabindex="-1"><span></span></a>Java SDK ☕️</h2>
<p>We've brewed up a fresh SDK for you and have added Java to our list of <a href="https://docs.knock.app/reference#client-libraries">officially supported SDKs</a>, making it easy to use Knock in your Java projects (including Spring Boot).</p>
<p>You can get started with the Java SDK by <a href="https://github.com/knocklabs/knock-java">checking out the repo on GitHub</a>, or adding the following to your <code>build.gradle</code> file:</p>
<pre><code class="language-groovy">dependencies {
  implementation 'app.knock.api:knock-client:0.2.0'
}
</code></pre>
<p>Looking for an SDK that we don't currently support? <a href="mailto:hello@knock.app">Let us know</a> and we'll consider adding it.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added a new set of <a href="https://knock.app/integrations">integration pages</a> to our marketing site to showcase all of the providers that Knock connects to</li>
<li>🐛 We fixed an issue that was causing our test runner to fail to execute test runs</li>
<li>🐛 Setting a very long recipient identifier no longer causes a batch step to fail in a workflow execution</li>
<li>🐛 Email steps that have missing layouts no longer cause previews to return a 500 error</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Inline identification]]></title>
            <description><![CDATA[Identify your users and objects in Knock right within your notify calls]]></description>
            <link>https://knock.app/changelog#2022-06-28</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-06-28</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 28 Jun 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-identify-users-and-objects-within-your-notify-calls"><a href="#identify-users-and-objects-within-your-notify-calls" tabindex="-1"><span></span></a>Identify users and objects within your notify calls</h2>
<p>Today we're making it even easier to create and update your users and objects in Knock. You can now perform user and object identifications as an inline action within calls to the <a href="https://docs.knock.app/reference#trigger-workflow-inline-identify">workflow trigger API</a>.</p>
<p>When calling the trigger API, you can choose to include maps of properties describing users and objects to identify in Knock in the <code>recipients</code> and <code>actor</code> fields. While processing your workflow, we'll create or update each of these recipients accordingly.</p>
<pre><code class="language-bash">curl --location --request POST 'https://api.knock.app/v1/workflows/my-workflow/trigger' \
  --header 'Authorization: Bearer sk_test_1234' \
  --header 'Content-Type: application/json' \
  --data-raw '{
    "key": "my-workflow",
    "recipients": [
      {"id": "user-1", "name": "User 1", "email": "user1@knock.app"}
    ]
  }'
</code></pre>
<p>Our goal is to make Knock as straight forward as possible for you to get started, and powerful enough to scale with your ever evolving needs. With inline identification, you can trigger your first Knock notification with <a href="https://docs-git-bc-kno-1408inline-identify-docs-knocklabs.vercel.app/getting-started/quick-start#4-trigger-your-workflow">a single API call</a>, as well as explore new ways to manage your users in Knock.</p>
<p>See our guides on identification <a href="https://docs.knock.app/send-and-manage-data/users#when-to-identify-users-in-knock">for users</a> and <a href="https://docs.knock.app/send-and-manage-data/objects#sending-object-data-to-knock">for objects</a> for more details.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 In Knock analytics you can now group notification usage by enagement status</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Go SDK]]></title>
            <description><![CDATA[Use our new Go SDK to power your product notifications]]></description>
            <link>https://knock.app/changelog#2022-06-17</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-06-17</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 17 Jun 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-go-sdk"><a href="#go-sdk" tabindex="-1"><span></span></a>Go SDK</h2>
<p>We've expanded our SDK coverage to support Go, making it effortless to start powering your notifications from your Go applications and services.</p>
<p>You can get started with the Go SDK by running <code>go get github.com/knocklabs/knock-go</code> or <a href="https://github.com/knocklabs/knock-go">checking out the repo</a>.</p>
<p>Want an SDK that we don't currently support? <a href="mailto:hello@knock.app">Let us know</a> and we'll consider adding it.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 You can now toggle the active status of a webhook to mark it as disabled and stop it sending</li>
<li>👀 We added a new section in our documentation on <a href="https://docs.knock.app/getting-started/going-to-production">going to production</a></li>
<li>🐛 We fixed an issue where in-app notifications in the dashboard weren't getting marked as seen</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Knock analytics]]></title>
            <description><![CDATA[Knock analytics, and other fixes and improvements]]></description>
            <link>https://knock.app/changelog#2022-06-14</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-06-14</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 14 Jun 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="gain-important-insights-into-your-notifications">Gain important insights into your notifications</h2>
<p>Today we’re launching Knock analytics. With Knock analytics, you get a single dashboard for understanding the notifications you’re sending across all of your Knock channels, in all of your Knock environments.</p>
<p>With Knock analytics you can understand:</p>
<ul>
<li>How your overall notification usage is trending over time.</li>
<li>How usage volume compares across your different channels and workflows, and whether there are opportunities to batch notifications to decrease the notification volume you’re sending to your users.</li>
<li>How your delivery rates look for each of your notification channels so you can quickly identify configuration issues.</li>
</ul>
<p>One of the core value props of Knock is that we act as a single layer to interact with all your delivery providers and their data. Knock analytics is a big part of that, giving you a single place to find valuable insights about the cross-channel notifications you send to your customers.</p>
<p><video controls muted><source src="/assets/changelog/analytics-demo.mp4" type="video/mp4" /></video></p>
<h2 id="fixes-and-improvements">Fixes and improvements</h2>
<ul>
<li>🌱 We expanded the <a href="https://docs.knock.app/integrations/overview">integration guide</a> in our documentation to cover every provider we support</li>
<li>🌱 We created and <a href="https://github.com/knocklabs/in-app-notifications-example-nextjs">open sourced</a> a new in-app notifications example app: <a href="https://knock-in-app-notifications-react.vercel.app/">knock-in-app-notifications-react.vercel.app</a></li>
<li>👀 We improved a loading state for API logs, now shown when applying filters or paginating</li>
<li>👀 We improved the API error message when a nonexistent workflow is triggered</li>
<li>👀 We improved the API error message when a JWT signing key is not yet generated for a non-development environment</li>
<li>👀 We improved the API error message when attempting to set channel data on channels that do not support them</li>
<li>🐛 We fixed the message details page to now correctly show its archived status</li>
<li>🐛 [React Feed] We fixed an issue where Knock websocket connections were being terminated unexpectedly in React 18</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Webhooks]]></title>
            <description><![CDATA[Message webhooks, new in-app UI docs, a PHP SDK and more.]]></description>
            <link>https://knock.app/changelog#2022-06-02</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-06-02</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 02 Jun 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-use-outbound-webhooks-to-respond-in-realtime-to-events-within-knock"><a href="#use-outbound-webhooks-to-respond-in-realtime-to-events-within-knock" tabindex="-1"><span></span></a>Use outbound webhooks to respond in realtime to events within Knock</h2>
<p>Today we’re shipping support for webhooks in Knock so that you can more easily respond to the notification events happening and keep your system synchronized with the data in Knock. For more advanced use-cases of Knock, our customers need to keep track of the data that we’re generating within their own system. Given the inherently asynchronous nature of sending notifications, there hasn't been a great way to do this today without polling data endpoints. Enter webhooks!</p>
<p>In your dashboard you'll now see a page where you can configure a webhook to listen to a number of events related to messages sent via your workflows. Once you set up an endpoint in your service to receive them, you can add the URL to the webhook creator and select which events you'd like to subscribe to. When your webhook starts sending requests you'll see delivery logs for those in the dashboard as well.</p>
<p>Some examples of how you can put webhooks to use in your system:</p>
<ul>
<li>Store messages longer than our internal retention period</li>
<li>Populate a custom log of the messages sent to individual users in your system</li>
<li>Execute a side-effect in your application if a specific event occurs</li>
</ul>
<p>With webhooks, you're in more control of your notification data than ever before.</p>
<p><a href="https://docs.knock.app/send-and-manage-data/outbound-webhooks">Read the documentation to get started →</a></p>
<h2 id="user-content-building-in-app-ui-docs"><a href="#building-in-app-ui-docs" tabindex="-1"><span></span></a>Building in-app UI docs</h2>
<p>When we first built the Knock Feeds API and <a href="https://github.com/knocklabs/react-notification-feed">React component library</a>, we built them with feeds in mind. Since then we've seen customers use our notification infrastructure to build feeds, toasts, inboxes, preferences experiences, and much more! We've completely re-built our in-app UI documentation to showcase our in-app use cases and how to support them, whether you're building with React, Javascript, or React Native.</p>
<p><a href="https://docs.knock.app/in-app-ui/overview">Check out the new documentation →</a></p>
<h2 id="user-content-php-sdk"><a href="#php-sdk" tabindex="-1"><span></span></a>PHP SDK</h2>
<p>We've expanded our SDK coverage to support PHP. That means you're now easily able to integrate Knock into your Laravel applications with ease! You can get started with the PHP SDK by running <code>composer require knocklabs/knock-php</code>, or <a href="https://docs.knock.app">looking at our docs</a>.</p>
<p><a href="https://github.com/knocklabs/knock-php">PHP SDK on GitHub →</a></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 We now show items that have been removed from a batch in our debugger</li>
<li>🌱 We made our new documentation search even more thorough as we now index all of our <a href="https://docs.knock.app/reference">API reference</a> too</li>
<li>👀 Users can now be added from the dashboard in any environment, previously we restricted them from being created in production</li>
<li>👀 We added the ability to filter workflows by a category and cleaned up the workflows list</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Batch notifications dynamically with user, environment, and notify data]]></title>
            <description><![CDATA[An even more powerful batching function for your notification workflows.]]></description>
            <link>https://knock.app/changelog#2022-05-25</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-05-25</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 25 May 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-batch-notifications-dynamically-with-user-environment-or-notify-data"><a href="#batch-notifications-dynamically-with-user-environment-or-notify-data" tabindex="-1"><span></span></a>Batch notifications dynamically with user, environment, or notify data</h2>
<p>Building on our dynamic batch window work earlier this month, batch steps can now be configured with a dynamic batch window that draws from recipient, actor, notify, or environment variable data. A few use cases this unlocks:</p>
<ul>
<li>Power per-user digests, where the digest frequency (i.e. daily, weekly) is set as a per-user preference</li>
<li>Use an environment variable to shorten batch windows in development and staging environments for easier testing</li>
<li>Set a batch window with data sent in your notify call, such as the priority or severity of an issue</li>
</ul>
<p>Simply select "Batch for a dynamic window" followed by the batch window type (Recipient, Actor, or Data) and provide the batch window key for looking up the batch window value. This value can be either an <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO-8601 timestamp</a> (e.g. <code>2022-05-05T20:00:00Z</code>), or it can be a relative duration in the following format:</p>
<pre><code class="language-json">{
  "unit": "minutes", // Must be one of seconds, minutes, hours, days, weeks, or months
  "value": 10 // Any non-negative integer
}
</code></pre>
<p>With this release, our batch function just got even more powerful and we're excited to see what our customers use it to build.</p>
<p><a href="https://docs.knock.app/designing-workflows/batch-function#setting-the-batch-window">Read the documentation to get started →</a></p>
<h2 id="user-content-search-the-knock-docs"><a href="#search-the-knock-docs" tabindex="-1"><span></span></a>Search the Knock docs</h2>
<p>A popular request for our API documentation is finally here! Now you can search for items in our API docs to find what you need. Enjoy!</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 You can now clone workflow steps from within the workflow editor</li>
<li>🌱 Workflow logs are now viewable on each workflow under a new “Logs” tab, filtered to show API logs for just that workflow</li>
<li>🌱 We now support Mailjet as an email channel</li>
<li>🌱 Read-only requests (e.g. loading user feeds) are a little faster thanks to under-the-hood improvements</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Example app]]></title>
            <description><![CDATA[Learn how to implement Knock with our new example app]]></description>
            <link>https://knock.app/changelog#2022-05-17</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-05-17</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 17 May 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-learn-with-our-example-app"><a href="#learn-with-our-example-app" tabindex="-1"><span></span></a>Learn with our example app</h2>
<p>Today we're announcing our first example app. We're a team that loves to learn by example when we're picking up new developer tools. The fastest way to understand how a tool works is to see it working in real code. Now you can learn by example when you're trying out Knock.</p>
<p>With the Knock example app you can see how a hypothetical collaboration product uses Knock to:</p>
<ol>
<li>Send welcome emails to new users after signup</li>
<li>Trigger cross-channel notifications across email and in-app surfaces when actions happen in the app</li>
<li>Power Slack integrations, including resource-to-channel notifications</li>
<li>Customize user preferences per workflow and channel type</li>
<li>Enable users to mute notifications for a particular resource</li>
<li>Identify users and their preferences during initial setup with our bulk APIs</li>
</ol>
<p>Our example app will continue to evolve as we ship new improvements, so stay tuned for more updates!</p>
<p><a href="https://github.com/knocklabs/example-collaboration-app/">Check out the example app repo →</a></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We now display better error messages when logs can't be retrieved</li>
<li>👀 We now support liquid tags on email channels from name attribute</li>
<li>🐛 We fixed an issue where email preview errors weren't being communicate well to dashboard users</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Silent push notifications & dynamic batch windows]]></title>
            <description><![CDATA[New push notification & batch window features, and other fixes and improvements]]></description>
            <link>https://knock.app/changelog#2022-05-05</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-05-05</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 05 May 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-send-silent-push-notifications-with-knock"><a href="#send-silent-push-notifications-with-knock" tabindex="-1"><span></span></a>Send silent push notifications with Knock</h2>
<p>If you've used a smartphone, you know about push notifications. You may not be as familiar with silent push notifications.</p>
<p>Silent push notifications wake up your app in the background without interrupting your user. As Apple explains it, “A [silent push notification is a notification that doesn’t display an alert, play a sound, or badge your app’s icon. It wakes your app in the background and gives it time to perform some actions”.</p>
<p>An example: in a news reader app you might send silent push notifications when there's new content you want your app to download in the background. Once the new content has finished downloading, you could send a normal push to your user with the latest headline. When your user opens the app, the content is ready, making the experience snappy and polished.</p>
<p>Starting today, Knock supports silent push notifications on Apple, Firebase Cloud Messaging, and Expo Push. For our news reader example, what would have been a complicated set of backend logic becomes a single API call to a three step workflow whenever breaking news arrives:</p>
<ol>
<li>Send a silent push notification</li>
<li>Delay (long enough for the device to load their content)</li>
<li>Send a normal push notification</li>
</ol>
<p>You can learn more about how to use silent push notifications in <a href="https://docs.knock.app">our docs</a>.</p>
<h2 id="user-content-dynamic-batch-windows"><a href="#dynamic-batch-windows" tabindex="-1"><span></span></a>Dynamic batch windows</h2>
<p>Knock has always supported batching notifications over a set window of time. Now, batch steps can be configured to take a dynamic batch window that is set when you trigger your workflow.</p>
<p>A dynamic batch window will wait for an interval of time provided by you in the <code>data</code> of your notify call under a key you set when you create your workflow. The key you specify in the workflow editor can be dot-delimited (e.g. <code>nested.path.to.window</code>) to reach nested attributes. When this workflow step runs, Knock will use this value to set when your batch window will close.</p>
<p>This value can be either an <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO-8601 timestamp</a> (e.g. <code>2022-05-05T20:00:00Z</code>), or it can be a relative duration in the following format:</p>
<pre><code class="language-json">{
  "unit": "minutes", // Must be one of seconds, minutes, hours, days, weeks, or months
  "value": 10 // Any non-negative integer
}
</code></pre>
<p><a href="https://docs.knock.app/designing-workflows/batch-function#setting-the-batch-window">Read the documentation to get started →</a></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 The objects page on the dashboard now shows preferences (Previously object preferences were only managed via the API)</li>
<li>🌱 Email channel settings can now use liquid tags and be dynamically populated</li>
<li>🌱 We now support deleting user and object channel data via the API</li>
<li>👀 We now lazy load message delivery logs and limit the list of logs to 25 at a time to keep the experience snappy</li>
<li>👀 We improved email layout previews to look even more accurate to what is actually sent</li>
<li>🐛 When viewing batched workflows in the debugger, we show more detail about batched workflows including their current status</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Visual template editor for email channels]]></title>
            <description><![CDATA[Visual template editor for email, and other fixes and improvements]]></description>
            <link>https://knock.app/changelog#2022-04-27</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-04-27</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 27 Apr 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="design-beautiful-notifications-with-our-visual-template-editor">Design beautiful notifications with our visual template editor</h2>
<p>Today is a good day. We’re shipping our visual template editor to make it even easier to craft great-looking product notifications from within Knock.</p>
<p>Now you can use our drag-and-drop editor to build great looking email notifications that include text, buttons, quotes, and dividers, all without having to write a single line of 90s-era email HTML. (IYKYK.) This is a low code editor, not a no code editor. This means that we take away all the annoying parts of writing email templates, while still giving you the flexibility of markdown, HTML, and liquid syntax for variable injection and control flow. And of course if you want to write raw HTML and CSS on your own, you're always welcome to.</p>
<p>We’ve even added new branding settings so you can ensure your brand elements are consistent across all of your product messaging. 🌠</p>
<p>As of today, our visual template editor is only available for email templates. We'll be expanding the visual template editor to other channel types with interactive components such as Slack later this year. For notification channels with text-only templating—SMS, push, in-app—you'll be able to use the same code editor you already use in Knock. 👍</p>
<p><video controls muted><source src="/assets/changelog/visual-template-editor.mp4" type="video/mp4" /></video></p>
<p><a href="https://docs.knock.app/send-notifications/designing-workflows#visual-editing-with-drag-and-drop-components">Read the documentation to get started →</a></p>
<h2 id="fixes-and-improvements">Fixes and improvements</h2>
<ul>
<li>👀 We added a better empty state display for Objects when none was found for a given collection</li>
<li>👀 We improved the design of the variable pane in the message template editor</li>
<li>🐛 We fixed an issue where message logs for email notifications with attachments were taking long to be retrieved in dashboard</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Preference conditions]]></title>
            <description><![CDATA[Preference conditions, more accurate email previews, and other fixes and improvements]]></description>
            <link>https://knock.app/changelog#2022-04-22</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-04-22</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 22 Apr 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-more-granular-preference-options-with-conditions"><a href="#more-granular-preference-options-with-conditions" tabindex="-1"><span></span></a>More granular preference options with conditions</h2>
<p>When working with preferences, you’ll sometimes run into advanced use cases where you need to provide even more granular preference options for your customers. For example: you may want to let a user mute notifications about a given resource in your product. That’s where preference conditions come into use in the Knock model: they provide a powerful way for you to add extra logic that’s computed during preference evaluation per recipient.</p>
<p>You can now apply a set of <code>conditions</code> to an individual category, workflow, or channel type preference, which will need to return <code>true</code> to send the notification out. The conditions you create can reference properties in your <code>data</code> payload or on the <code>recipient</code>. Here's an example of a condition where we only send a notification if the current resource is not in a list of muted ids for a recipient:</p>
<pre><code class="language-json">{
  "argument": "data.pageId",
  "operator": "not_contains",
  "variable": "recipient.mutedPageIds"
}
</code></pre>
<p><a href="https://docs.knock.app/send-and-manage-data/preferences#preference-conditions">Read the documentation to get started →</a></p>
<h2 id="user-content-more-accurate-email-previews"><a href="#more-accurate-email-previews" tabindex="-1"><span></span></a>More accurate email previews</h2>
<p>We know making sure you see an accurate preview for your notifications is crucial when creating your notifications. Previously, we had rendered a close approximation of your emails on the client, but there were some cases where what you would see in the preview tab would differ from what you'd see when you ran a test.</p>
<p>From today we now render the emails on the backend, applying the same set of transformations to the email as you get before it's delivered to your users. This means a much more accurate previewing experience, CSS warts and all #htmltables4eva.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We now show you the variable pane on our workflow builder, with a new button in the top bar to toggle the variable pane on and off in both the builder and the message template editor</li>
<li>👀 We moved the action menu in the email template editor into the top bar, cleaning up the UI</li>
<li>🐛 We fixed an issue where our <code>users.identify</code> and <code>objects.set</code> endpoints weren't correctly upserting data</li>
<li>🐛 We fixed an issue with attachments on AWS SES not coming through correctly</li>
<li>🐛 We fixed an issue in our Elixir SDK where calling the <code>Users.get_feed/3</code> endpoint with no options would cause an error</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New messages API]]></title>
            <description><![CDATA[New messages API and other fixes and improvements]]></description>
            <link>https://knock.app/changelog#2022-04-15</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-04-15</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 15 Apr 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-new-messages-api"><a href="#new-messages-api" tabindex="-1"><span></span></a>New messages API</h2>
<p>Now you can bring the messages you send with Knock into your own product to power customer support and message logging use cases. Our new message API endpoints allow you to list all of the messages generated by Knock, as well as access additional message information such as batched activities, triggering events, and message content. Our messages API also supports a number of filtering options, so you can easily find the messages you're looking for.</p>
<p><a href="https://docs.knock.app/reference#list-messages">Read the API documentation →</a></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 Our <code>identify</code> endpoint no longer requires a <code>name</code> or an <code>email</code> for a user</li>
<li>🐛 We fixed a bug where nested variable paths weren't being properly parsed when a value existed for a top level path in the template editor</li>
<li>🐛 We fixed an edge case in our push sender where sending any empty data payload on a notify call would cause an error</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Send Discord notifications]]></title>
            <description><![CDATA[Power your Discord bots and incoming webhooks with Knock]]></description>
            <link>https://knock.app/changelog#2022-03-29</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-03-29</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 29 Mar 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-send-discord-notifications-with-knock"><a href="#send-discord-notifications-with-knock" tabindex="-1"><span></span></a>Send Discord notifications with Knock</h2>
<p>Now you can use Knock to power the notifications you send to Discord.</p>
<p>We support incoming webhooks and Discord bots, so whether you're sending notifications to an internal Discord channel or to a bot that your users are OAuth'ing into their own Discord servers, Knock has you covered.</p>
<p>Like all channels in Knock, once you've configured Discord you're ready to add it into any of your notification workflows. Plus, you'll get full observability into the responses we receive from the Discord API so you can debug as needed.</p>
<p><a href="https://docs.knock.app/integrations/chat/discord">Learn more about our Discord integration →</a></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 We shipped a new request buffer to help buffer incoming workflow trigger requests at scale</li>
<li>🌱 We shipped our new push documentation to our docs after it had previously lived in our legacy support feature guides</li>
<li>👀 We made a number of improvements to the variable pane editor. Now when you remove all references to a variable in your templates, its corresponding variable is automatically removed from the pane. If you rename all instances of a variable, its corresponding variable in the pane is renamed. This is a big win for variable pane usability 🙌</li>
<li>👀 We improved our messaging in the debugger about skipped batch steps when a batch key could not be found in the <code>data</code> payload of the workflow trigger</li>
<li>🐛 We fixed a bug where new users could be created by calling the preferences endpoint with a non-existing <code>user_id</code></li>
<li>🐛 We fixed a bug where certain template schemas would cause the app to crash upon attempting to view a workflow</li>
<li>🐛 We fixed a bug where the email preview pane would hang when it couldn't find a layout with which to render the preview</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Fixes and improvements]]></title>
            <description><![CDATA[Fixes and improvements]]></description>
            <link>https://knock.app/changelog#2022-03-18</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-03-18</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 18 Mar 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<p>It's been a whirlwind of a week here at Knock HQ with our official launch yesterday 🎉</p>
<p>And now, we are back to our regularly scheduled programs — shipping!</p>
<ul>
<li>🌱 knock.app got a facelift with brand new designs!</li>
<li>🌱 We added a system status page: status.knock.app</li>
<li>🌱 We added JSON editor support for Slack</li>
<li>🌱 We added email attachments support for Mailgun</li>
<li>👀 Improved the design of toast alerts throughout dashboard</li>
<li>👀 Improved the design of associated activities in the message overview</li>
<li>👀 Improved the description of the batch key behavior in the workflow editor</li>
<li>👀 Improved the empty state display for objects, and non-development environments</li>
<li>👀 Added an ability to add a short description (up to 280 chars) to your workflows</li>
<li>👀 Added an ability to use liquid syntax for email overrides</li>
<li>👀 [Docs] Added a language selector for all of code examples</li>
<li>👀 We now automatically set the default retention period of 365 days when creating an in-app channel</li>
<li>👀 We now automatically create a message template when creating a new channel step in a workflow</li>
<li>👀 We now consistently refer to "uncommitted" changes instead of "unstaged" in some places previously</li>
<li>👀 We now display a configured provider logo when choosing a channel step in the workflow editor</li>
<li>🐛 Added the missing chat type to the workflows filter</li>
<li>🐛 Fixed an issue of accidental duplicate user accounts when signing up by handling user emails case insensitive</li>
<li>🐛 Fixed the "View Workflow" link in the popover menu in the Workflows table</li>
<li>🐛 Fixed an issue where cloning a workflow with overrides was erroring</li>
<li>🐛 Fixed a request timeout issue with viewing certain log items</li>
<li>🐛 Fixed the message status logic to use the highest status when there are multiple messages (if one message is "read" and another is "seen", then the evaluated status is "read")</li>
<li>🐛 [Docs] Fixed the "Flash of Unstyled Text" (FOUT) issue</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Microsoft Teams support and more]]></title>
            <description><![CDATA[Microsoft Teams support, workflows read-only mode and more]]></description>
            <link>https://knock.app/changelog#2022-02-28</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-02-28</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Mon, 28 Feb 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-power-your-microsoft-teams-notifications-with-knock"><a href="#power-your-microsoft-teams-notifications-with-knock" tabindex="-1"><span></span></a>Power your Microsoft Teams notifications with Knock</h2>
<p>Following our recent Slack support release, we are delighted to announce we now support Microsoft Teams as a new provider for our <code>chat</code> channel type 🎉.</p>
<p>Learning how to integrate with a new 3rd-party chat app provider can be a pain. You have to read through a lot of documentation just to understand how their integration model works, and you have to learn their message formatting syntax. With our Teams integration, we're abstracting away the schlep so you can focus on what matters: delivering great messaging.</p>
<p>You can add a Teams step to any of your workflows, just like any other channel. Once you do, we let you use basic markdown to edit your notification templates—we handle the translation into Microsoft's Adaptive Card syntax. If you want to build more advanced Teams messages, we give you a JSON editor so you can write Adaptive Cards yourself.</p>
<p>Like all channels in Knock when you use Teams you get full observability into the responses we receive from the Teams API, and you can store Teams channel data on user or non-user recipients.</p>
<p><a href="https://docs.knock.app/integrations/chat/microsoft-teams">Learn more about our Microsoft Teams integration →</a></p>
<h2 id="user-content-workflows-read-only-mode"><a href="#workflows-read-only-mode" tabindex="-1"><span></span></a>Workflows: read-only mode</h2>
<p>Knock was built with isolated environments from day one to ensure our customers didn't accidentally make changes to notifications in production. As of today, you can navigate into your production workflows in a safe, read-only mode so you can see which version is live in your production environment (and send test notifications as you need to.)</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 We added support for users to change their user names within the Knock dashboard</li>
<li>👀 We updated the template editor theme to make it easier to parse liquid keywords, variables, and control flow operators</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Email attachments]]></title>
            <description><![CDATA[Email attachments, batch improvements, and more]]></description>
            <link>https://knock.app/changelog#2022-02-17</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-02-17</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 17 Feb 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-email-attachments"><a href="#email-attachments" tabindex="-1"><span></span></a>Email attachments</h2>
<p>As of today you can include attachments in the email notifications you send with Knock.</p>
<p>Knock already enables you to dynamically update the content of your notifications with variable injection using the <code>data</code> you pass to us in your notify calls, and now you can include one or more attachments within that payload and we'll attach them to your email messages at workflow runtime.</p>
<p>We had to do some interesting work under the hood here to support large incoming data payloads (more on that another time), but we're now able to process multiple files (up to 10mb each) in a rock solid way. We hope you're as <em>attached</em> to this feature as we are. 😁</p>
<p><a href="https://docs.knock.app/integrations/email-attachments">Learn more in our docs</a></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 Batch keys are no longer required on batch functions. When no batch key is provided we batch by the recipient and workflow by default</li>
<li>👀 We added a new "commit all" action in your development environment under the commits panel</li>
<li>👀 We improved the commits panel in the dashboard</li>
<li>👀 We made the logs page more obvious and not hidden under the "Developers" section</li>
<li>👀 Large binaries sent in your data payloads will now be truncated in API logs</li>
<li>🐛 We fixed a bug with our trigger condition logic where steps that didn't produce a message would always evaluate to false on trigger conditions referencing that output</li>
<li>🐛 We fixed an issue where Slack summaries were not optional (as they should have been)</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Get started with Knock]]></title>
            <description><![CDATA[New onboarding flow; adding workflow categories; multiple email layouts]]></description>
            <link>https://knock.app/changelog#2022-02-04</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-02-04</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 04 Feb 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-new-customer-onboarding"><a href="#new-customer-onboarding" tabindex="-1"><span></span></a>New customer onboarding</h2>
<p>When you start with a new developer tool, it can be hard to know how to go from tinkering in your local environment to going live in production. Our new onboarding flow shows the basic steps you need to complete to send notifications to your customers in production using Knock.</p>
<p>We've included the relevant context for making your first API calls to Knock, and we show your progress so you know what to do next. We're excited to see how this guide helps new customers implement notifications in their product even faster than before.</p>
<h2 id="user-content-set-notification-preferences-by-workflow-category"><a href="#set-notification-preferences-by-workflow-category" tabindex="-1"><span></span></a>Set notification preferences by workflow category</h2>
<p>As of today you can add categories to your workflows in Knock and use those categories in your notification preferences.</p>
<p>Sometimes you want to enable your users to set a preference for a broad category of notifications instead of presenting them with preference controls for every type of notification you send. For example, you might have a category for <code>direct</code> notifications that includes everything from mentions to approvals to tasks due in the next 24 hours. You can learn more about how to power use cases such as this one in <a href="https://docs.knock.app/send-and-manage-data/preferences">our preferences documentation</a>.</p>
<h2 id="user-content-use-multiple-email-layouts-in-knock"><a href="#use-multiple-email-layouts-in-knock" tabindex="-1"><span></span></a>Use multiple email layouts in Knock</h2>
<p>Many of our customers use a default email layout across all of their transactional notifications, but sometimes you want a different layout for when you're sending a welcome notification from a founder (no styling at all) or an email from your marketing team (a bit more pizzazz). Now you can create multiple email layouts in Knock to use in the different workflows you power with our product.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 We fixed a caching issue with cloning workflows</li>
<li>👀 We added an explicit save button for our email layouts to make the editing experience better</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SOC2 Type 2 compliance]]></title>
            <description><![CDATA[Knock is now SOC2 Type 2 compliant]]></description>
            <link>https://knock.app/changelog#2022-02-01</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-02-01</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 01 Feb 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-soc-2"><a href="#soc-2" tabindex="-1"><span></span></a>SOC 2</h2>
<p>Knock has successfully completed its SOC 2 Type II audit, certifying the effectiveness of our security processes and controls. You can learn more in <a href="https://knock.app/blog/announcing-our-soc-2-certification">our blog post announcement</a>.</p>
<p>We've built Knock with security at the forefront of our design and architecture from day one. Now, automated monitoring through Vanta and formal policies allow us to stay up to date on our security posture at all times.</p>
<p>If you're a customer that would like to receive a copy of the report, please send us a note at <a href="mailto:security@knock.app">security@knock.app</a>.</p>
<h2 id="user-content-filter-debugger-by-endpoint"><a href="#filter-debugger-by-endpoint" tabindex="-1"><span></span></a>Filter debugger by endpoint</h2>
<p>We've added endpoint filtering to our debugger to make it easier to find the requests you're looking for. If you're debugging preferences work, filter to only see requests made to our preferences endpoint. If you're debugging our feed, filter to see feed requests. And so on.</p>
<p><img src="/assets/changelog/debugger-endpoint-filters.png" alt="Debugger filters"></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We now surface test runner calls in our developer debugger so you can dig into their workflow runs just as you would for normal API calls made to Knock</li>
<li>👀 We've made <code>actor</code> optional on our workflow trigger endpoint (after some helpful customer feedback!). When you include <code>actor</code> on a request you can use the <code>actor.</code> namespace to access user schema properties about the user or object that triggered the notification</li>
<li>👀 The debugger now shows linked batched workflows on batch steps so you can know which subsequent events were included in a given batch</li>
<li>👀 We updated our docs to move our API reference to its own dedicated part of the site. This gives it some breathing room and surfaces each endpoint as its own section of the sidebar for easier navigation</li>
<li>👀 We added a new page to our API documentation describing the functionality of our Feeds API</li>
<li>🐛 We fixed a bug where browser auto-fills were hijacking the inputs in our test runner</li>
<li>🐛 We fixed a few links in the dashboard that were linking to outdated support documentation</li>
<li>🐛 We fixed a bug where long account names would squish the account icon in the dashboard sidebar</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Visually manage footer links in email layout template]]></title>
            <description><![CDATA[New feature: Visually manage footer links in email layout template, merge users API, and more]]></description>
            <link>https://knock.app/changelog#2022-01-25</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-01-25</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 25 Jan 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-visually-manage-footer-links-in-email-layout-template"><a href="#visually-manage-footer-links-in-email-layout-template" tabindex="-1"><span></span></a>Visually manage footer links in email layout template</h2>
<p>Email is an important and widely used channel for many of our customers. If you are using an email channel in Knock, one of the first things you'll want to do is define the layout template for your emails. Knock already generates a great looking email layout for you as a starting point so you can quickly customize it to meet your needs, such as adding links to the footer section. But right now, this requires jumping into the code editor and fiddling with HTML or text content, which can feel like a hassle. We can do better.</p>
<p>Starting today, we've made our default email layout template available through a visual editor, so you can easily add footer links to our out-of-the-box email layout without having to jump into code. You provide the text and URLs for the footer links, and Knock will automatically translate them into HTML links or text equivalents in the layout template. Of course, you always have the ability to drop into the code editor for complete flexibility.</p>
<h2 id="user-content-merge-users-api"><a href="#merge-users-api" tabindex="-1"><span></span></a>Merge users API</h2>
<p>You may run into a situation where you’ve identified an invited user to send them a notification and then that user “graduates” to a fully fledged user after they sign up, leaving you with two user profiles in Knock. Our merge users API is here to help you in this scenario!</p>
<p>You can now call the <a href="https://docs.knock.app/reference#merge-user"><code>users.merge</code> method</a> in our SDKs to merge two user profiles together, moving the properties, channel data, and preferences from one user to another. The merge call will also move the message sending history so you can a nice, clear view on the messages sent.</p>
<p><a href="https://docs.knock.app/send-and-manage-data/users#merging-users">Read more in the users docs →</a></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 We added an ability to override certain email channel settings per template for more flexibility</li>
<li>👀 [Docs] We updated to include more thorough explanations on <a href="https://docs.knock.app/designing-workflows/overview#function-steps">workflow functions</a>: batching, delays, and throttling</li>
<li>👀 [Docs] We added new <a href="https://docs.knock.app/security">security</a> page to provide more information on our security posture and policies</li>
<li>👀 [SDK] We released the latest <a href="https://github.com/knocklabs/knock-client-js">Client JS SDK</a> that improves TypeScript type definitions and introduces two new types of events (<code>items.received.page</code> and <code>items.received.realtime</code>)</li>
<li>👀 [API] We added rate limiting on our feeds endpoint (5 reqs/sec/user) as a safety measure for availability of our service</li>
<li>👀 [SDK] All of our SDKs have been updated to reflect the new merge users API</li>
<li>👀 We improved how we display workflow steps in the workflow editor to show its description, when available</li>
<li>🐛 We updated the label of the user id filter UI to read "contains" instead of "is equal to" to more accurately describe the fuzzy match logic</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Slack, object support, and a whole lot more]]></title>
            <description><![CDATA[We now support Slack as a provider, along with non-user entities as recipients in your notifications.]]></description>
            <link>https://knock.app/changelog#2022-01-14</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-01-14</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 14 Jan 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-power-your-slack-notifications-with-knock"><a href="#power-your-slack-notifications-with-knock" tabindex="-1"><span></span></a>Power your Slack notifications with Knock</h2>
<p>It's always an exciting day here at Knock when we add another channel type to our product. Today we're thrilled to announce that we now support Slack via our new <code>chat</code> channel type. Slack needs no introduction, but our integration in Knock might.</p>
<p>It's now effortless to add Slack support to your product, so your customers can connect their Slack workspace and receive updates in their channels about what's happening in your product. And of course our Slack channel comes with batching, delays, and everything else the Knock workflow engine supports, so you can send more thoughtful, engaging notifications to your customers in Slack.</p>
<p>We made our Slack channel model as flexible as possible, so you control where your customers integrate into Slack and how they map resources in your product into destination channels within Slack. This means that no matter what part of your model you want to map into Slack channels– users, accounts, workspaces, projects–we have you covered.</p>
<p><a href="https://docs.knock.app/integrations/slack">Learn more about our Slack integration →</a>
<a href="https://docs.knock.app/send-and-manage-data/objects#slack-channel-notifications">See an example →</a></p>
<h2 id="user-content-objects-model-and-syncronize-non-user-entities-in-knock"><a href="#objects-model-and-syncronize-non-user-entities-in-knock" tabindex="-1"><span></span></a>Objects: model and syncronize non-user entities in Knock</h2>
<p>Our vision for Knock has always been to power complex notification workflows for your product. Sometimes those workflows necessitate sending notifications to non-users entities in your system. That's where objects come in.</p>
<p>Objects are a powerful and flexible way to ensure Knock always has the most up-to-date information required to send your notifications. They also enable you to send notifications to non-user recipients.</p>
<p>You can use objects to:</p>
<ul>
<li>send out-of-app notifications to non-user recipients (such as a Slack channels)</li>
<li>send in-app notifications to non-user resources in your product (the activity feed you see on a Notion page is a good example)</li>
<li>reference mutable data in your notification templates (such as when a user edits a comment before a notification is sent)</li>
</ul>
<p>As an example, SaaS applications often enable users to connect an object in the product they're using to a channel in their own Slack workspace. That way when something happens in that object (e.g. a comment is left) they receive a notification about it in their connected Slack channel. In this case, we can sync (via <code>objects.set</code>) this entity into Knock, connect Slack data to it (via <code>objects.setChannelData</code>), and then reference it as a recipient in a workflow trigger.</p>
<p>We're really excited about the power that objects can unlock for modeling your notification workloads and about the future possibilities they enable. Expect to see a lot more here soon!</p>
<p><a href="https://docs.knock.app/send-and-manage-data/objects">Learn more about Objects in our docs →</a></p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 [Docs] We added new <a href="https://docs.knock.app/integrations/overview">provider integration guides</a> into our docs</li>
<li>👀 [API] We now support bulk identifying, deleting, and setting preferences for users, available in <code>>= v0.4.0</code> of our SDKs and via <a href="https://docs.knock.app/reference#bulk-identify-users">our API</a>.</li>
<li>👀 We added a new link to the docs in the bottom left of the dashboard, as well as way to easily send us a support ticket (powered by our new Slack integration internally 😎)</li>
<li>👀 We improved the tooltips for workflows with no changes, and message templates that have no changes</li>
<li>🐛 We fixed an issue with long property keys overflowing on the user detail page</li>
<li>🐛 We fixed a bug where in a very particular case the messages page wouldn't load</li>
<li>🐛 We fixed a caching bug with our template gallery where after cloning a template you might see incorrect values</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Workflow debugger]]></title>
            <description><![CDATA[New feature: Workflow debugger]]></description>
            <link>https://knock.app/changelog#2022-01-11</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-01-11</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 11 Jan 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="workflow-debugger-see-into-the-knock-notification-engine">Workflow debugger: see into the Knock notification engine</h2>
<p>At Knock, we don't think engineering teams should have to give up observability when they decide to rely on a third-party tool instead of building in-house. That's why we've made a focused investment on our debugging tools: we want you to have the same visibility into the Knock notification engine that you'd have if you were running a notification system on your own.</p>
<p>Today we're excited to announce a big step forward for observability into the Knock notification engine that shows exactly what happens when you trigger a notification in Knock.</p>
<p>With our new debugger you can see all of the requests you've sent to the Knock API and, for each one, drill into its related workflow runs, its exception catches (if any are present), and the notifications generated and sent to your customers. We even show non-errors, such as when a user has opted out of a given notification via preferences or if they haven't received a push notification because they haven't installed your mobile app.</p>
<p>You can access the workflow debugger under the "Developers" page in the dashboard. Just open any workflow trigger log and open the workflow runs tab to inspect your workflows.</p>
<p><video controls muted><source src="/assets/changelog/workflow-debugger.mp4" type="video/mp4" /></video></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Workflow template gallery]]></title>
            <description><![CDATA[New feature: workflow template gallery]]></description>
            <link>https://knock.app/changelog#2022-01-06</link>
            <guid isPermaLink="false">https://knock.app/changelog#2022-01-06</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 06 Jan 2022 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-workflow-template-gallery"><a href="#workflow-template-gallery" tabindex="-1"><span></span></a>Workflow template gallery</h2>
<p>We took the legwork out of starting notification workflows from scratch: now you can use the built-in template gallery for inspiration or out-of-the-box workflows. This helps developers new to Knock get a sense of what's possible, and for those already familiar with building workflows, a baseline to build from.</p>
<p>You can access the template gallery in two places: first, from the <code>Create workflow</code> button, you'll see there's now a segment to view templates and create directly from there. Secondly, if you've created a blank workflow you'll see a new button to <code>Start with a template</code>.</p>
<p>We've added several categories of templates we see you use most often: collaboration, growth, and authentication. Each one has preset steps that you can adjust once you create your template to tailor to your users. Any channel steps will also automatically use one of your own configured channels.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 Added the ability to rename and archive channels</li>
<li>👀 Added a number of new liquid helpers including timezone, currency, hashing and more (<a href="https://docs.knock.app/designing-workflows/template-editor/reference-liquid-helpers">see the docs here</a>)</li>
<li>👀 The template editor for SMS and push notifications is now resizable</li>
<li>👀 You can now reset the data payload on the test runner when it deviates from the current workflow schema</li>
<li>🐛 Previously line breaks showed as <code>\n</code> in push previews; they now show as true line breaks</li>
<li>🐛 We fixed a bug in which the conditions editor didn't allow periods for nested data</li>
<li>🐛 We now correctly parse integers and floats in step trigger conditions, rather than treating everything as a string</li>
<li>🐛 Fixed a bug where the quick reference would open when typing "?" in the variable pane text editor</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Inline notification actions in the React notification feed]]></title>
            <description><![CDATA[New features: inline notification actions, and more.]]></description>
            <link>https://knock.app/changelog#2021-12-08</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-12-08</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 08 Dec 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-inline-action-support-in-feed-components"><a href="#inline-action-support-in-feed-components" tabindex="-1"><span></span></a>Inline action support in feed components</h2>
<p>Actionable notifications are key in creating a great notification experience for your customers. This is especially useful for things like approvals, or for inline comment replies inside of your application, so your users can take a quick, contextual action right in the notification feed.</p>
<p>Previously, you'd have to extend our <code>NotificationCell</code> component to add inline actions, but with the new <code>v0.5.3</code> release of the <a href="https://github.com/knocklabs/react-notification-feed"><code>@knocklabs/react-notification-feed</code></a> library, you can now easily add actions using our pre-built components. Use our button components to add asyncronous actions like approve or reject flows, or bring your own components to introduce any kind of inline action to your notifications.</p>
<p>Take a look at <a href="https://docs.knock.app/notification-feeds/customizing-ui#adding-inline-actions">the documentation</a> to get started.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added support for showing the uploaded account icon in the top left corner of the dashboard</li>
<li>🐛 We fixed an issue with our SMS providers where users created in the dashboard could cause messages to fail to send</li>
<li>🐛 We fixed a bug with our template editor where the page would reload and you would lose your work in certain circumstances</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Branding settings, official .NET SDK, and other improvements]]></title>
            <description><![CDATA[New features: Branding settings to upload and manage your assets, offical .NET SDK, and more.]]></description>
            <link>https://knock.app/changelog#2021-12-02</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-12-02</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 02 Dec 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-manage-your-branding-assets-directly-within-knock"><a href="#manage-your-branding-assets-directly-within-knock" tabindex="-1"><span></span></a>Manage your branding assets directly within Knock</h2>
<p>Notifications use branding elements, such as a logo or an icon, to communicate and reinforce your brand values with your users. When you get started with Knock, one of the first things you'll want to do is define those brand elements in your layouts and templates. We now support uploading and managing your brand assets within the Knock dashboard to make this initial experience easier.</p>
<p>Under Settings, you now have a new Branding tab where you will be able to upload your logo as well as an icon. Once uploaded, these branding assets are automatically set and accessible as template variables, so you can start using them in your layouts and templates immediately. We've also added a preview panel so you can quickly get a sense of how they look and feel.</p>
<p>Lastly, Knock will host these uploaded assets for you behind a Content Delivery Network (CDN), closer to where your users are so they always render as quickly as possible.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 We now have an official Knock <a href="https://github.com/knocklabs/knock-dotnet">.NET SDK</a>! It is available via the NuGet package manager</li>
<li>👀 We made several visual refinements to the dashboard sidebar menu</li>
<li>👀 We improved the workflow list to show the types of channel steps configured in each workflow, so you can get an idea about your workflows at a quick glance</li>
<li>👀 We improved the usability of defining a trigger condition based on a message status, by using a picklist of message statuses instead of using operators</li>
<li>👀 We improved the visibility of the step menu button in the workflow editor</li>
<li>🐛 We fixed a bug where in-app provider settings were not being saved</li>
<li>🐛 We fixed an issue where a workflow remained in the browser cache after being archived</li>
<li>🐛 We fixed a flaky hotkey issue in the workflow editor where pressing (E) did not always take you to the selected step for edit</li>
<li>🐛 We fixed a usability issue when defining a trigger condition, where you can now only refer to a step prior to the selected step</li>
<li>🐛 We fixed a bug in the email preview where 'From' and 'To' addresses weren't correctly shown based on the selected channel or the recipient</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Workflow filters, step previews, and other improvements]]></title>
            <description><![CDATA[New features: workflow filters to easily find workflows, see step type previews, and more.]]></description>
            <link>https://knock.app/changelog#2021-11-16</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-11-16</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 16 Nov 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-workflow-filters-and-step-previews"><a href="#workflow-filters-and-step-previews" tabindex="-1"><span></span></a>Workflow filters and step previews</h2>
<p>When you start adopting Knock to power all of your notifications in your product, you can end up with a <em>lot</em> of different workflows. To make finding a particular workflow easier, we now support workflow filters. You can filter by a workflow's status (whether it's active or not), whether it has uncommitted changes, by its name or key, and even by the types of steps it contains. Now finding the workflow you're looking for is a breeze!</p>
<p>We've also added a preview to the types of steps within a workflow, so you can easily see all of the workflows that contain a batch step, or even all of your push notification workflows, right from the workflows list.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We improved the blank state designs for messages, users, and channels and added a new no results blank state when you're filtering and there are no results.</li>
<li>🐛 We fixed a bug where going to the message debug logs wouldn't allow you to use the browser back button.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Add users in the dashboard, reset workflow changes, and other fixes]]></title>
            <description><![CDATA[New features: add a new user from the dashboard, reset unstaged workflow changes, and more.]]></description>
            <link>https://knock.app/changelog#2021-11-10</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-11-10</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 10 Nov 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-add-users-right-from-the-dashboard"><a href="#add-users-right-from-the-dashboard" tabindex="-1"><span></span></a>Add users right from the dashboard</h2>
<p>To make getting started with Knock even easier, you can now manually add a user to a development environment, right from the users page in the Knock dashboard. This means you can easily add a new user to start sending test notifications without using our API or SDKs.</p>
<p>Additionally, when your teammates accept an invite to join your account on Knock we now add them as a user so you can start sending them test notifications. You'll see them appear in your development environment under your users list, and in test runner.</p>
<h2 id="user-content-resetting-unstaged-changes-to-a-workflow"><a href="#resetting-unstaged-changes-to-a-workflow" tabindex="-1"><span></span></a>Resetting unstaged changes to a workflow</h2>
<p>Sometimes you make changes to a workflow in testing that you want to throw away. Instead of needing to manually revert the changes back to the previous state, you can now select the 'Reset all unstaged changes' button in the workflow menu to reset the workflow to its last committed state.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 We added the ability to rename and archive the workflow from the three dot menu on the Workflow page.</li>
<li>🌱 We added a new <code>onMarkAllAsReadClick</code> callback to our feed component so you can easily instrument that event, and improved the accessibility of the component in the <a href="https://github.com/knocklabs/react-notification-feed/releases/tag/v0.5.2">v0.5.2 release</a>.</li>
<li>👀 We improved our user search typeahead component to not collapse users with the same email into one row. We also now show the user id, or email depending on what's being searched for to help you find the right user.</li>
<li>👀 We added a new channel filter on the messages list so you can easily find all messages that were sent to a certain channel.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Channel sandbox mode, email tracking, and other fixes]]></title>
            <description><![CDATA[New features: sandbox mode for your channels, email tracking, and more.]]></description>
            <link>https://knock.app/changelog#2021-11-05</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-11-05</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Fri, 05 Nov 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><em>Today marks exactly 6 months since we published our first changelog, way back on <a href="/changelog/2021-05-05">May 5th</a> 🎉. The product has come a long way in that time, and it's fun to look back on all that we've shipped. Onwards!</em></p>
<h2 id="user-content-sandbox-mode-test-notifications-without-sending-them"><a href="#sandbox-mode-test-notifications-without-sending-them" tabindex="-1"><span></span></a>Sandbox mode: test notifications without sending them</h2>
<p>Sometimes you don't want a message to be sent in a local or testing environment, but you do want the ability to debug your messages and see what <em>might</em> have gone out. Our new "sandbox mode" enables you to generate and preview messages for a given channel, without sending them to your downstream provider for delivery. Sandbox mode is great for when you want to test a channel's output, but want your messages to end up at <code>/dev/null</code> instead of actually sending live notifications through that channel.</p>
<p>You can enable sandbox mode via your channel configuration from the dashboard today and it's supported across SMS, push, and email channels.</p>
<h2 id="user-content-autogenerate-plaintext-emails"><a href="#autogenerate-plaintext-emails" tabindex="-1"><span></span></a>Autogenerate plaintext emails</h2>
<p>Writing both an HTML and plaintext template for your emails can be a tedious process. To speed things up, you can now generate the plaintext template straight from the HTML you've crafted, automatically.</p>
<p>All new email templates have this feature enabled by default from today. You'll see the generated plaintext content in the editor and in the preview. If you want to change the setting, you can do so from the plaintext view in the email template editor by toggling the "automatically generate plaintext" switch.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 We added the ability to enable email open and link tracking within supported email providers. You'll see the options inside the environment configuration for your provider and they will default to "off" (don't track).</li>
<li>🌱 You can now rename environments that you have created from the environments list view in the dashboard.</li>
<li>🌱 We now send over the workflow key as a tag, or category to the downstream email provider. This makes
it easier to do segmentation and analysis of your emails.</li>
<li>👀 We improved the timeline design and debugger blank state in the messages view.</li>
<li>👀 We made the wording consistent for when you're committing unstaged changes to an environment.</li>
<li>🐛 We fixed a bug whereby you couldn't create an environment with the same name as one that was deleted.</li>
<li>🐛 We fixed an interesting edge case in our notification engine that affected test runs in very particular cases.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Log debugger, editor improvements, and more]]></title>
            <description><![CDATA[Debug your Knock developer logs]]></description>
            <link>https://knock.app/changelog#2021-10-28</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-10-28</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 28 Oct 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="debug-your-knock-developer-logs">Debug your Knock developer logs</h2>
<p>Today we're launching the first piece of the Knock debugger experience. In our new debugger logs, you can see all of the API requests you've made to Knock, view their status, and filter to find the requests that you need to debug.</p>
<p>This is our first step towards a goal that's important to us at Knock: full developer visibility and observability into the Knock notification engine. It's our belief at Knock that when you use a 3rd-party system to power a part of your stack that's as important as notifications, you shouldn't have to sacrifice visibility and observability.</p>
<p>We have a lot more exciting updates coming soon in this part of the product. Stay tuned.</p>
<p><video controls muted><source src="/assets/changelog/Debugger-v1.mp4" type="video/mp4" /></video></p>
<h2 id="fixes-and-improvements">Fixes and improvements</h2>
<ul>
<li>🌱 You can now pop out a separate window for code editing on single-line fields that accept variables and liquid logic, such as subject lines and action URLs</li>
<li>🌱 We added the ability to filter by recipient email on our message logs. This makes it even easier to quickly look into any notification issues you're hearing from a specific customer</li>
<li>👀 Now when you push workflows to production we show you which of those workflows are inactive in production and ask you whether you want to activate them</li>
<li>🐛 We fixed a bug where the undo/redo stack was lost when you'd move back and forth between the editor and the preview in the template editor</li>
<li>🐛 We fixed a bug in the test runner where shifting focus back to an actor or recipient field would cause the field to miss the first character inputted into the field</li>
<li>🐛 We fixed a bug where Chrome auto-fill was appearing on fields in the test runner</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[List filtering, template quick reference, and new push and SMS providers]]></title>
            <description><![CDATA[Filter across lists of your resources]]></description>
            <link>https://knock.app/changelog#2021-10-21</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-10-21</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 21 Oct 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="list-filtering">List filtering</h2>
<p>Now you can filter across all lists of resources within Knock. Whether you're looking for a specific workflow, a notification you sent to a customer, or a user within Knock, you can use filters to quickly find what you're looking for.</p>
<p>This is especially helpful for debugging use cases. Want to find all of the notifications sent to a particular recipient? Just filter by that recipient's email address or user ID to find every notification you've ever sent them.</p>
<p>We'll also be adding filtering to our new debugger, which you'll see show up in this changelog in the coming weeks. 🤫</p>
<p><video controls muted><source src="/assets/changelog/list-filters.mp4" type="video/mp4" /></video></p>
<h2 id="new-channel-support-expo-for-push-telnyx-for-sms">New channel support: Expo for push, Telnyx for SMS</h2>
<p>We added two new providers this week. If you manage your mobile app and push notifications through Expo, you can now orchestrate those notifications from within Knock. Same goes for Telnyx. You can now send Telnyx SMS messages from Knock.</p>
<h2 id="template-editor-quick-reference">Template editor quick reference</h2>
<p>Over the last months of our invite-only beta, we've been amazed at the different types of notifications our customers power with Knock. They've used our template editor to build notifications with conditional logic, for loops, and copy that updates depending on the number of items in a given batch.</p>
<p>To help our new customers discover the power of the Knock template editor, today we're shipping our quick reference guide. Just press <code>?</code> to open the reference and see a list of the properties and keywords you can use to build your Knock templates.</p>
<p><img
src="/assets/changelog/template-quick-reference.png"
alt="Screenshot of a template editor quick reference"
/></p>
<p>We've also added new documentation about our template editor, so you can go even deeper into the functionality available within it.</p>
<h2 id="fixes-and-improvements">Fixes and improvements</h2>
<ul>
<li>👀 We shipped a new and improved trigger condition editor that makes it a lot easier to reference the read status of other steps when deciding whether to send a given notification, (e.g. don't send an email if the in-app notification has already been seen.)</li>
<li>🌱 We made it easier to preview the action url on an in-app feed message, it now appears beneath the input and on hover of the message in preview</li>
<li>🌱 We added the ability to provide a from name on our email channel configurations so you can put your best foot forward when sending emails to customers</li>
<li>🐛 We improved the stability and performance of our push notification sender</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Reorder workflow steps with drag and drop]]></title>
            <description><![CDATA[A fast way to update your notification workflows in Knock.]]></description>
            <link>https://knock.app/changelog#2021-10-13</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-10-13</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 13 Oct 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="reorder-your-workflow-steps-with-drag-and-drop">Reorder your workflow steps with drag and drop</h2>
<p>You can now reorder the steps in a workflow with drag and drop. This is especially helpful when you want to introduce a new batch or delay function into an existing workflow.</p>
<p><video controls muted><source src="/assets/changelog/drag-and-drop-3.mp4" type="video/mp4" /></video></p>
<h2 id="fixes-and-improvements">Fixes and improvements</h2>
<ul>
<li>🐛 We fixed a bug in our environment promotion flow where multiple commits to the same workflow could get into the incorrect order in staging, causing discrepancies between development and production environments</li>
<li>🐛 We fixed a bug where new users would get routed to an empty environment on initial sign-in</li>
<li>🐛 We fixed a bug where refreshing the users page while in the production environment would route you to development</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Wait until timestamp delay block and bulk message operations]]></title>
            <description><![CDATA[New delay function: wait until timestamp, bulk message operations, and other improvements]]></description>
            <link>https://knock.app/changelog#2021-10-06</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-10-06</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 06 Oct 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-new-delay-function-wait-until-timestamp"><a href="#new-delay-function-wait-until-timestamp" tabindex="-1"><span></span></a>New delay function: wait until timestamp</h2>
<p>Delays in Knock have always allowed you to pause the execution of a workflow for a fixed period of time. These "delay for duration" delays are handy for conditional sends and reminders, such as the <a href="/blog/using-knock-to-power-knock">invite notifications that we power with Knock</a>. With this release we've made delays even more powerful by adding support for "wait until timestamp", where you can specify a future timestamp in your notify payload at which you want the workflow to resume execution. The classic use case for this is task reminders, where you need to trigger notifications at a specific timestamp in the future, rather than at a fixed period from when the workflow was executed.</p>
<p>You can start using timestamp-based delays today. Just select the 'Wait until timestamp' option in the delay step and specify the key to look up the timestamp from your data payload.</p>
<h2 id="user-content-bulk-message-operations-api"><a href="#bulk-message-operations-api" tabindex="-1"><span></span></a>Bulk message operations API</h2>
<p>We heard from some of our power users that they needed the ability to bulk modify the status of messages sent to their customers, which is especially helpful when needing to archive all of the existing messages for a given user, or mark all of the messages for a particular channel as read.</p>
<p>We've introduced our new bulk message status API to address this need, which lets you update the status of messages on a given channel without needing to know the message ids. It's the first bulk operation API at Knock, and we also introduced an accompanying <a href="https://docs.knock.app/reference#bulk-operations">bulk operation endpoint</a> so you can monitor the progress of these jobs.</p>
<p>You can find the new bulk endpoint in our <a href="https://docs.knock.app/getting-started/knock-and-postman">Postman collection</a>, or can read the <a href="https://docs.knock.app/reference#bulk-update-channel-message-status">API documentation</a> to interact with them via cURL.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 We updated our dashboard to include the currently active environment in the URL, making it easier to share links to users, workflows, and messages with your colleagues</li>
<li>🌱 We improved the empty state you see when a message can't be found, keeping it inline with what you see for users and workflows</li>
<li>🐛 We fixed an edge case in our workflow engine whereby a workflow step could be triggered multiple times when a channel configuration was missing in the environment</li>
<li>🐛 We fixed a visual layout issue with our workflow editor where the canvas didn't extend to the bottom of the page</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Knock test runner]]></title>
            <description><![CDATA[Test runner, and several other fixes and improvements]]></description>
            <link>https://knock.app/changelog#2021-09-28</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-09-28</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 28 Sep 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="test-your-notifications-without-leaving-knock">Test your notifications without leaving Knock</h2>
<p>We just shipped the Knock test runner. Now it's easier than ever to test the notifications you build and send with Knock!</p>
<p>If you've been responsible for testing notifications in the past, you know how painful it can be. To test just a single notification, you need to create multiple test users in your product and re-create the real-life scenarios in which they'll receive the notification. It's a time-intensive, tedious process, and one that makes it hard to ensure your customers are getting the best notifications experience possible.</p>
<p>With the test runner, you can test your notifications from right within the Knock dashboard. You can choose which notification(s) you'd like to test, determine which users or test aliases should receive the notification, and run tests across your different development and staging environments as needed. The test runner will remember the inputs used in the last test run for next time, so you can rapidly test and iterate on your notifications.</p>
<p>It just got a whole lot easier to make sure you're delivering great notifications to your customers.</p>
<p>Here's a look at the test runner in action:</p>
<p><video controls muted><source src="/assets/changelog/test_runner_1080.mp4" type="video/mp4" /></video></p>
<h2 id="push-individual-workflows-to-production">Push individual workflows to production</h2>
<p>When you're working as a team in Knock, you'll often have a few different notification workflows you're building in parallel. Now you can pick and choose which of those workflows you want to push to production, rather than having to push all of them at once.😅 We're excited to see larger teams adopting Knock and asking for features like these to improve their workflow.</p>
<h2 id="fixes-and-improvements">Fixes and improvements</h2>
<ul>
<li>🌱 Improved the sidebar layout of the dashboard for easier and more intuitive navigation</li>
<li>🌱 Added a new "FCM + APNS" channel group option that can be configured to group both providers as a single push channel (available by request while in beta)</li>
<li>🌱 Push notifications now include <code>knock_message_id</code> field in its message data payload, so you can easily track push messages and mark them as seen or read</li>
<li>🐛 Fixed a bug with HTML sanitization in our message editor that caused issues with rendering certain email templates</li>
<li>🐛 Fixed an issue with timestamps rendering truncated in the Users and the Messages pages</li>
<li>🐛 Fixed an issue with an user avatar not updating correctly in the feed item preview when switching actor or recipient users</li>
<li>🐛 Fixed an issue where some fonts were not being fetched in the Knock dashboard</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React notification feed 0.5.0]]></title>
            <description><![CDATA[A whole load of feed improvements, message previews, and other fixes]]></description>
            <link>https://knock.app/changelog#2021-09-21</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-09-21</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 21 Sep 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-feed-components-dark-mode-pagination-and-archiving"><a href="#feed-components-dark-mode-pagination-and-archiving" tabindex="-1"><span></span></a>Feed components: dark mode, pagination, and archiving</h2>
<p>We've bundled a whole heap of new fixes and improvements in our <code>0.5.0</code> release of our <a href="https://github.com/knocklabs/react-notification-feed">React in-app notification feed component</a>:</p>
<ul>
<li>🌱 Support for dark mode via the new <code>colorMode</code> prop</li>
<li>🌱 Added automatic pagination support for when there are more than 50 messages in the feed</li>
<li>🌱 Notifications can now be archived easily from the feed component</li>
<li>🌱 Added support for overriding the <code>avatar</code> rendered in the notification cell</li>
<li>🐛 Fixed an issue with dismissing the component in the popover not working when using the trigger</li>
<li>🐛 Fixed an issue where the avatar would show > 2 characters for names that are more than 2 words</li>
<li>🐛 Updated all of our dependencies to the latest and greatest versions</li>
</ul>
<p>You can also read about how to get up-and-running using our feed components <a href="https://knock.app/blog/using-the-knock-feed-component-to-add-an-in-app-feed-to-your-product">in our new blog post</a>.</p>
<h2 id="user-content-message-previews"><a href="#message-previews" tabindex="-1"><span></span></a>Message previews</h2>
<p>We now support sent messages previews in the Knock dashboard! Just head on over to a sent message and go to the 'Preview' tab to see a representation of the message that we sent to the customer.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 Shipped <code>@knocklabs/client@0.5.0</code> which includes a new <code>networkStatus</code> API and optimistic archiving support on the feed</li>
<li>🌱 Switched to using refresh tokens in the dashboard to prevent frequent logouts</li>
<li>🌱 Moved to using <code>a</code> tags for our tables so now right clicks and other browser features just work</li>
<li>🌱 Workflows now show when they have pending changes</li>
<li>🐛 Improved the click area on our table cells for ease of navigation</li>
<li>🐛 Fixed an XSS vulnerability in our message editor</li>
<li>🐛 Fixed a bug where cloning workflows doesn't enforce the key constraints</li>
<li>🐛 Fixed some users being incorrectly logged out in the dashboard</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Fixes and improvements]]></title>
            <description><![CDATA[Fixes and improvements]]></description>
            <link>https://knock.app/changelog#2021-09-09</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-09-09</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 09 Sep 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<p>It's a short week here at Knock HQ, but we've still got some goodies for you:</p>
<ul>
<li>👀 Added support for dynamic delays specified by a value in the notify data payload</li>
<li>🌱 Improved the way long workflow names are handled in the dashboard, as well as some other layout fixes</li>
<li>🌱 Added pagination to the workflow list in the dashboard</li>
<li>🌱 Improved the in-app notification feed rendering speed</li>
<li>🐛 Fixed an issue with a batch step so a specified duration is honored instead of always using a default 30s</li>
<li>🐛 Fixed an issue with FCM where integers and booleans in the data payload would cause an error when sending messages</li>
<li>🐛 Fixed an issue where users with non-url encoded characters in the id wouldn't load in the dashboard</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[View delivery logs]]></title>
            <description><![CDATA[View delivery logs and other improvements]]></description>
            <link>https://knock.app/changelog#2021-08-31</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-08-31</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 31 Aug 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-view-delivery-logs"><a href="#view-delivery-logs" tabindex="-1"><span></span></a>View delivery logs</h2>
<p>The dashboard now lets you inspect message delivery logs!</p>
<p>Our new delivery log viewer makes it very easy to see every request to and response from your downstream providers for each message, which provides full visibility into the downstream execution history of a message.</p>
<p>For example, when you're configuring a new channel with Knock, you may run into errors from a downstream provider like SendGrid or <a href="/changelog/2021-08-25">Apple's Push Notifications Service</a>. If you can't see these errors in Knock, it makes it hard to know what's going on and how to fix the problem. Delivery logs make it easy to investigate issues like this.</p>
<p>To view these logs:</p>
<ol>
<li>On the dashboard, open the Messages page (You can also open the Messages tab for any of your users)</li>
<li>Click on the message you would like to inspect</li>
<li>Open the Debug panel to explore each request &#x26; response linked to that message</li>
</ol>
<p>(<strong>Note:</strong> Messages sent to our in-app feed will have no debug logs because they are entirely managed by Knock.)</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 We updated the channel and the workflow page to display each provider's brandmark where relevant for better UX</li>
<li>🌱 We added a new user's "channel data" page for viewing the configured channel data for each user</li>
<li>👀 When configuring a new channel, available providers are now organized by channel type making it easy to find and selected the provider you want</li>
<li>👀 We added support for removing items in a batch via our cancellation API</li>
<li>👀 We improved how we render liquid templates</li>
<li>👀 We pushed updates to our SDKs for Python, Ruby, Elixir, and Node to support our latest features, including the new <a href="https://docs.knock.app/send-notifications/setting-channel-data">channel data API</a> for managing user-specific data such as device tokens for push notifications</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Push support]]></title>
            <description><![CDATA[Send push notifications with Knock]]></description>
            <link>https://knock.app/changelog#2021-08-25</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-08-25</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 25 Aug 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-push-notification-support"><a href="#push-notification-support" tabindex="-1"><span></span></a>Push notification support</h2>
<p>Push it to the limit. 🤘 We now support sending push notifications from Knock.</p>
<p>If you're using native push notification services (such as Apple Push Notifications service or Firebase Cloud Messaging), you can quickly configure your provider as a push channel within Knock and add it to any of your existing notification workflows. We also support platform-specific previews, so you can see what your push notification looks like across iOS and Android.</p>
<p>As always, push can be used with the <a href="https://docs.knock.app/send-and-manage-data/preferences">Knock preferences model</a> to manage a given user's preferences for receiving push notifications alongside their preferences for other channels such as email, in-app feeds, and SMS.</p>
<p>(<strong>Note:</strong> We are not supporting intermediary push notification services such as OneSignal in this release. But we will be soon. If that's you, shoot us a note at hello@knock.app and let us know.)</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We added our Ruby SDK to the code examples modal on our workflow trigger step</li>
<li>👀 We cleaned up the placeholder copy in our sign up flow</li>
<li>🐛 We fixed a bug in our quick start guide example</li>
<li>🐛 We fixed a bug for handling unknown message statuses</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ruby SDK]]></title>
            <description><![CDATA[Ruby SDK]]></description>
            <link>https://knock.app/changelog#2021-08-18</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-08-18</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 18 Aug 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-ruby-sdk"><a href="#ruby-sdk" tabindex="-1"><span></span></a>Ruby SDK</h2>
<p>We've expanded our SDK coverage to support Ruby, the shiny "gem" of a language that's ever popular in the startup community. That means you're now easily able to integrate Knock into your Ruby-on-Rails applications!</p>
<p>You can get started with the Ruby SDK by running <code>gem install knockapi</code> or <a href="https://github.com/knocklabs/knock-ruby">checking out the repo</a>.</p>
<p>Want an SDK that we don't currently support? <a href="mailto:hello@knock.app">Let us know</a> and we'll consider adding it.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 You can now see the phone number and avatar under the main properties on the user page</li>
<li>👀 We made the API keys and other sensitive values hide their values by default</li>
<li>👀 We fixed an issue whereby you couldn't load message information on the user page in the dashboard</li>
<li>🔐 We added rate-limiting to critical endpoints in the management API as well as adding other security patches</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SMS support]]></title>
            <description><![CDATA[Send text messages with Knock]]></description>
            <link>https://knock.app/changelog#2021-08-11</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-08-11</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 11 Aug 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-sms-support"><a href="#sms-support" tabindex="-1"><span></span></a>SMS support</h2>
<p>We now support sending text messages from Knock. If you're using an existing SMS platform provider (such as Twilio,) you can quickly configure your provider as an SMS channel within Knock and add it to any of your existing notification workflows.</p>
<p>As with all of our channel types, SMS can be used with the <a href="https://docs.knock.app/send-and-manage-data/preferences">Knock preferences model</a> to manage a given user's preferences for receiving SMS messages alongside their preferences for other channels such as email and in-app feeds.</p>
<p>We had a number of requests from our early customers to support SMS, and we're excited to add this new channel type to Knock to help our customers orchestrate their cross-channel notifications.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 We updated our channel model in Knock to make it easier to change which provider you're using for a given step in a notification workflow. This helps with multi-provider management and will have a number of benefits as we support push and chat app notifications later this summer. Stay tuned</li>
<li>👀 We updated our in-app feed react component to use plain CSS instead of CSS-in-JS. Two nice wins here: the package is smaller and you can extend/override the default CSS used in the component</li>
<li>👀 We updated the default behavior of the in-app feed component to wrap text without breaking words</li>
<li>👀 We improved our topbar height consistency throughout the dashboard to minimize content layout shift as you navigate between the workflow builder and the notification designer</li>
<li>👀 We improved our toast component to make it dismissible in cases where it might block functionality</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Fixes and improvements]]></title>
            <description><![CDATA[Fixes and improvements]]></description>
            <link>https://knock.app/changelog#2021-08-05</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-08-05</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Thu, 05 Aug 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<p>We're heads down on some big new features this week, and we'll have more to say about that soon.
For now we have a smattering of improvements for you:</p>
<ul>
<li>👀 We added the ability to copy channel environment configuration from one environment to another, making it faster to setup your channels when your environment specific channel configuration is the same</li>
<li>🌱 Triggering a workflow via the API now returns an error if the actor specified does not yet exist</li>
<li>🌱 We added anchor links to our documentation site so that you can easily deep link to each heading</li>
<li>🐛 We fixed an issue where you could get stuck in an unauthenticated state on the dashboard</li>
<li>🔐 We've been hardening our infrastructure security to lock down any outside attack vectors</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mailgun support]]></title>
            <description><![CDATA[Mailgun support and other improvements]]></description>
            <link>https://knock.app/changelog#2021-07-27</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-07-27</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 27 Jul 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-mailgun-integration"><a href="#mailgun-integration" tabindex="-1"><span></span></a>Mailgun integration</h2>
<p>We now support Mailgun as an email provider within Knock!</p>
<p>If you are currently using Mailgun to send emails to your customers, you can now configure a new email channel with Mailgun in Knock and start using it in your workflows in no time.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We improved the template editor experience where you can now select a different user as an actor or a recipient when crafting your notification template</li>
<li>👀 We added the ability to include a custom message when inviting other team members to your Knock account</li>
<li>🌱 We added support documentation accessible via the '?' icon in dashboard header</li>
<li>🐛 We fixed the user preferences page to be read only (user preferences are updated via the Knock API)</li>
<li>🐛 We fixed a bug in the template editor where switching to text view didn't allow editing email texts</li>
<li>🐛 We fixed small styling inconsistencies across various popover menus in the dashboard header</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Variable explorer, SES, feedback]]></title>
            <description><![CDATA[Fixes and improvements]]></description>
            <link>https://knock.app/changelog#2021-07-14</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-07-14</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 14 Jul 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-variable-and-state-explorer"><a href="#variable-and-state-explorer" tabindex="-1"><span></span></a>Variable and state explorer</h2>
<p>When you design a cross-channel notification, you use a lot of shared variables across each of its per channel templates. Whether a notification about a new comment is sent across email, push, or in-app, it's always going to include context about the page it was left on and who left it.</p>
<p>We just shipped our variable explorer to manage this shared state across the different channel templates you design within Knock. The variable explorer makes it super easy to see which properties are available for use within a given workflow, whether they are global variables within your Knock account, properties from your notify or identify calls, or even temporary state generated by functions within your workflow.</p>
<p>Create a property once, then use it across all of the channel templates within your notification workflow. Try it out and let us know what you think.</p>
<h2 id="user-content-amazon-ses-integration"><a href="#amazon-ses-integration" tabindex="-1"><span></span></a>Amazon SES integration</h2>
<p>We now support Amazon's Simple Email Service (SES) as an email provider within Knock. This means that if you already use SES to send emails to your customers, you can get a Knock email channel up and running in minutes. We handle all email orchestration and user preferences with SES, all you have to do is configure your notifications within Knock and we take care of the rest.</p>
<p>You can learn more about how to configure SES in your Knock account in our <a href="https://www.notion.so/knockapp/How-to-send-email-through-AWS-SES-19e37e2a9fa64c77a65974319f217c54">support documentation</a>.</p>
<h2 id="user-content-leave-us-feedback"><a href="#leave-us-feedback" tabindex="-1"><span></span></a>Leave us feedback</h2>
<p>We added a new feedback component to the dashboard so you can tell us what you love and don't love about Knock. We want all the feedback we can get so have at it.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We improved the workflow builder so that recently configured channels appear in the builder without a browser refresh</li>
<li>👀 We improved the empty state in the workflow builder to help guide new users to channel configuration</li>
<li>👀 We updated the message details pane to make it more actionable</li>
<li>🐛 We fixed a bug in the message details pane where recipient info was being displayed instead of actor info</li>
<li>🐛 We fixed a bug related to multi-environment channel configuration</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Fixes and improvements]]></title>
            <description><![CDATA[Fixes and improvements]]></description>
            <link>https://knock.app/changelog#2021-06-29</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-06-29</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 29 Jun 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>👀 We improved the design of the trigger condition UX to make it easier to add conditions to a channel within a workflow (e.g. if you only want to send an email based on the read status of an in-app message)</li>
<li>👀 We added tooltips to our disabled states</li>
<li>🌱 We added a new state for when you switch between environments while viewing a resource that doesn't exist in the target environment. Instead of getting a 404, we tell you why the resource wasn't found and direct you to other environments in which you might find it</li>
<li>🐛 We fixed a bug where deleted users would cause the message log to error</li>
<li>🐛 We fixed a bug where creating a new step in the workflow builder would cause the page to 404</li>
<li>🐛 We fixed a text overflow bug in the variables table</li>
<li>🐛 We fixed a bug where real-time updates to your workflow schema wouldn't appear in the trigger step payload without a refresh</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Google auth and passwordless login]]></title>
            <description><![CDATA[Google auth and passwordless login]]></description>
            <link>https://knock.app/changelog#2021-06-22</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-06-22</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 22 Jun 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-google-auth-support"><a href="#google-auth-support" tabindex="-1"><span></span></a>Google auth support</h2>
<p>We added support for Google authentication into our login flow. If your organization uses Google Workspace to manage users, those users can log into Knock using their Google credentials.</p>
<h2 id="user-content-passwordless-login"><a href="#passwordless-login" tabindex="-1"><span></span></a>Passwordless login</h2>
<p>We also shipped passwordless authentication as part of this release. Two things we like about passwordless auth. First, if you're an end user you don't need to keep track of a password for Knock. Second, if you're an organization that enforces two-factor authentication through your identity provider (e.g. Google Workspace,) you can rest easy knowing that the only door into Knock is through the email account of that user.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🌱 We added a "get code examples" experience to the trigger step in a workflow. This helps you quickly look at code examples for our supported SDKs and grab the fully formatted notify call (with all necessary data variables included)</li>
<li>🐛 We fixed a bug where the message and user lists wouldn't properly load on first view</li>
<li>🐛 We fixed an issue with real-time updates per tenant on the notification feed component</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Multi-environment and tenancy support]]></title>
            <description><![CDATA[Multi-environment and tenancy support]]></description>
            <link>https://knock.app/changelog#2021-06-15</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-06-15</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Tue, 15 Jun 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-multi-environment-support"><a href="#multi-environment-support" tabindex="-1"><span></span></a>Multi-environment support</h2>
<p>Today we support two environments in Knock—development and production—to give you a way to create and test your notifications before pushing them to your customers. But sometimes two environments aren't enough to map to the logical environments that you use in your application.</p>
<p>We now support adding additional environments to Knock so you can ensure the environment promotion flow you use in Knock mirrors what you use in your own deployment flow.</p>
<p>You can add as many other additional environments as you need to support your software development lifecycle. Each new environment acts as a new branch in the content versioning model, allowing you to test in the isolated environment before releasing to production.</p>
<p>You can read more about <a href="https://docs.knock.app/send-and-manage-data/environments">versioning and environments in our guide</a>.</p>
<h2 id="user-content-tenancy-support"><a href="#tenancy-support" tabindex="-1"><span></span></a>Tenancy support</h2>
<p>Many SaaS applications today enable a single user to access multiple workspaces (or tenants) with the same login. This tenancy model keep data from different customers separate, while allowing users to easily switch between the workspaces they use within that application. As an example, as a Notion user, I use one workspace for my work and another workspace for my personal needs.</p>
<p>When it comes to notifications, the main place where tenancy comes into play is in-app feeds. In the example above, I wouldn't expect to be notified about activity from my personal workspace when I'm in the workspace I use at work.</p>
<p>Today we're releasing <em>tenancy support</em> to handle this use case. Notifications generated by Knock can now be scoped to a tenant, which ensures that they only appear in that tenant's instance of the Knock in-app feed.</p>
<p>We've completely overhauled our feed logic to support this feature. Everything is taken care of for you—tenant scoped feeds show accurate badge counts for just the notifications within that tenant, updates for that tenant populate in real-time—and support is available out-of-the-box in our latest <a href="https://github.com/knocklabs/react-notification-feed">React notification feed components</a> and <a href="https://github.com/knocklabs/knock-client-js">Client JS SDK</a>.</p>
<p>You can read more about this feature <a href="https://docs.knock.app/send-and-manage-data/multi-tenancy">in our guides</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>🐛 Fixed issue where archived workflows would appear on the "changes not yet in x" list</li>
<li>🐛 Fixed issue where new workflows would not show up in the unstaged changes list</li>
<li>🐛 Fixed issue where archiving a workflow with pending changes would still keep it in the destination environment</li>
<li>🌱 Added ability to duplicate workflows</li>
<li>🌱 Added support for displaying custom properties on a user profile page</li>
<li>👀 Improved the styling of account and environment variables to aid with clarity</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Preferences support]]></title>
            <description><![CDATA[Preferences support and small fixes]]></description>
            <link>https://knock.app/changelog#2021-06-09</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-06-09</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 09 Jun 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-preferences-support"><a href="#preferences-support" tabindex="-1"><span></span></a>Preferences support</h2>
<p>Preferences are a critical part of any notifications system. They let your users tell you when they want to hear from you, and when they don't. A good preferences system gives its users a way to unsubscribe from entire channels (such as email or push) and from individual notifications themselves.</p>
<p>We now support preferences on the Knock API. You can set preferences for your users at the channel, workflow, and channel-workflow level. This gives you the flexibility to offer your customers the preferences they want, in the format you want. You can keep your preferences high-level and just give your users a way to opt-out of channels, or get detailed and let them opt-out of specific notifications, or both.</p>
<p>The best part: once a user sets their preferences, we handle the rest. You won't have to write a single line of code to figure out whether a user needs to receive a given notification based on their preferences.</p>
<p>You can learn more about how Knock preferences work in our <a href="https://docs.knock.app/send-and-manage-data/preferences">API documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>Added support for user deletion for when users leave your product</li>
<li>Fixed an issue in the template editor where namespaced variables wouldn't save</li>
<li>Fixed a layout issue on the dashboard that was causing wonky scrolling behavior</li>
<li>Renamed Notification to Workflow in the Knock model to disambiguate between Notifications and Messages</li>
<li>Published version <code>0.2.0</code> of all Knock SDKs which includes preferences support</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Notify call code samples]]></title>
            <description><![CDATA[Notify calls just got easier and small fixes]]></description>
            <link>https://knock.app/changelog#2021-06-02</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-06-02</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 02 Jun 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-how-to-trigger-a-workflow"><a href="#how-to-trigger-a-workflow" tabindex="-1"><span></span></a>How to trigger a workflow</h2>
<p>When you're building a new notification workflow, it can be hard to keep track of all of the variables you're using across different channels and what you'll ultimately need to use in your notify call to Knock.</p>
<p>We've made this process easier by giving you a sample notify call right within the context of the Knock workflow builder. Just select your trigger step and you'll see the workflow key and data payload to use in your call to Knock. You can also view code examples in your language of choice to quickly copy-pasta the notify call into your backend.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>We updated all of our ID fields to include a quick copy action</li>
<li>We fixed a bug in the preview variable editor where text wasn't wrapping</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cancel a notification]]></title>
            <description><![CDATA[Cancel a notification and small fixes]]></description>
            <link>https://knock.app/changelog#2021-05-26</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-05-26</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 26 May 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-cancel-a-notification"><a href="#cancel-a-notification" tabindex="-1"><span></span></a>Cancel a notification</h2>
<p>Here's a standard use case: you schedule a notification to remind a user about a task they need to complete in a few days, then before you send it, they complete the task. You don't want to send a notification to the user about a task they've already completed. You want to cancel that notification before it sends. Introducing Knock notify cancellation.</p>
<p>Now when an event takes place in your product that means you no longer need to send a notification to a user (a task is completed, an invite is accepted,) you can cancel that notification before it gets sent.</p>
<p>Learn more about canceling workflows in our <a href="https://docs.knock.app/send-notifications/canceling-workflows">documentation</a>.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>Added a new default email layout that looks 👨‍🍳😘</li>
<li>Cleaned up the channel configuration form to better separate required and optional fields</li>
<li>Fixed a bug where the subject line in the preview editor was getting cut off at a certain length</li>
<li>Fixed a bug where clicking in the canvas outside of a workflow step wouldn't de-select a step</li>
<li>Updated the visual styling of our headers</li>
<li>Fixed a bug where navigating to the preview tab would register as a change on the commit log</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New users page]]></title>
            <description><![CDATA[Users page and small fixes]]></description>
            <link>https://knock.app/changelog#2021-05-19</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-05-19</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 19 May 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-see-the-users-youve-sent-to-knock"><a href="#see-the-users-youve-sent-to-knock" tabindex="-1"><span></span></a>See the users you've sent to Knock</h2>
<p>We added a users page to make it easier to see who you've sent to Knock. We've found this to be super helpful in development when you want to know what user properties you have available to use in a template design, and to see which users you can call via the API to test a given notification.</p>
<p>You can see the general properties of that user, along with the messages they've received from Knock.</p>
<p>To learn more about working with users via the Knock API, check out our <a href="https://docs.knock.app/send-and-manage-data/users">documentation</a>.</p>
<h2 id="user-content-we-open-sourced-our-react-notification-feed-package"><a href="#we-open-sourced-our-react-notification-feed-package" tabindex="-1"><span></span></a>We open sourced our React notification feed package</h2>
<p>Our <code>@knocklabs/react-notification-feed</code> package is now open sourced under an MIT license
and available on <a href="https://github.com/knocklabs/react-notification-feed">GitHub</a> 💃. These components
give you an instant, out-of-the-box notification feed that can be dropped into your app and includes
real-time updates, accurate badge counts, and marking as "seen" and "read".</p>
<p>If you're not using React, or you want to customize the UI you can use the lower-level
<a href="https://github.com/knocklabs/knock-client-js">client JS SDK</a>, which is exactly what our React feed is built with!</p>
<p>We're huge believers in open sourcing as much as we possibly can at Knock, and welcome contributions back
from the community in this or any of our other packages.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>Added an invite new members flow to make it easier for teams working in Knock to invite their teammates</li>
<li>Added API references to our API documentation</li>
<li>Fixed a workflow creation bug where typing "-" in label field wouldn't auto-complete "-" in key field</li>
<li>Fixed a bug where the timeline of events in a given message's log were out of order</li>
<li>Open-sourced our feed components</li>
<li>Fixed a bug where concurrent real-time feed updates would sometimes fail to populate both items in real-time</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Notification trigger conditions]]></title>
            <description><![CDATA[Notification trigger conditions and small fixes]]></description>
            <link>https://knock.app/changelog#2021-05-12</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-05-12</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 12 May 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-only-send-a-notification-when"><a href="#only-send-a-notification-when" tabindex="-1"><span></span></a>Only send a notification when...</h2>
<p>A lot of homegrown notification systems use simple logic when determining whether to notify a user on a given channel: if they can be reached on that channel, notify them. We would know, we shipped plenty of notifications that way at previous companies.</p>
<p>It gets the job done, but it also sends your users redundant email and push notifications about things they may have already seen in your app. There's a ticket in your backlog about sending email based on a condition, but you can never quite get to it.</p>
<p>Now you can user Knock trigger conditions to tell a Knock workflow when it should notify certain channels and when it shouldn't. You can do things such as only send an email if the sibling in-app notification of that email is unread after ten minutes.</p>
<p>We're jazzed about Knock trigger conditions and we're excited to see what you build with them.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>Added support for archiving workflows. Helpful for when you want to clear a workflow out of your dashboard that you aren't using anymore</li>
<li>Added real-time preview variable updates when switching between edit and preview tabs in workflow editor</li>
<li>Added local storage for preview variables so they persist as you navigate between different channels within a workflow</li>
<li>Added support for filtering by workflow key on feed API</li>
<li>Fixed an intermittent issue in feed when badge was only updating on feed open</li>
<li>Fixed a bug where unexpected integers were appearing in preview variables</li>
<li>Fixed a bug where iterating over workflow activities caused unexpected behavior in preview variables</li>
<li>Fixed blockquote markdown issue</li>
<li>Fixed a bug where adding variables to action URLs would add unexpected variables to the preview editor</li>
<li>Moved data key to the top of the Feed API response payload for better DX</li>
<li>Updated the auto-generated step name to be human readable</li>
<li>Updated key fields so they don't allow whitespace characters</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Invite-only beta live 🎉]]></title>
            <description><![CDATA[Private beta and small fixes]]></description>
            <link>https://knock.app/changelog#2021-05-05</link>
            <guid isPermaLink="false">https://knock.app/changelog#2021-05-05</guid>
            <dc:creator><![CDATA[Knock Engineering]]></dc:creator>
            <pubDate>Wed, 05 May 2021 12:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2 id="user-content-were-live"><a href="#were-live" tabindex="-1"><span></span></a>We're live</h2>
<p>We just went live with the Knock private beta. This changelog entry marks the first in what will be a weekly update on the new features, fixes, and improvements we've shipped at Knock.</p>
<p>There's a lot available in the private beta. Here are a few highlights.</p>
<ul>
<li>Send notifications to email and in-app channels</li>
<li>Use our in-app feed <a href="https://github.com/knocklabs/react-notification-feed">react component</a> to have a fully featured, real-time feed working in minutes. Want to build your own? Check out our <a href="https://github.com/knocklabs/">SDKs</a></li>
<li>Build advanced notification workflows with our batch and delay functions</li>
<li>Get full visibility into all of the messages sent by Knock and the delivery status of each</li>
<li>Manage your notifications using the same commit and environment promotion flow you use in-house</li>
</ul>
<p>If you want to see the product in action you can check out this <a href="https://www.loom.com/share/498939a259ce450aa0899c0551429607?sharedAppSource=team_library">six-minute demo</a>.</p>
<p>Want access to the Knock beta? Hit the "get notified" button at the top of this page to add your name to our wait list and to get notified when we have room available.</p>
<h2 id="user-content-fixes-and-improvements"><a href="#fixes-and-improvements" tabindex="-1"><span></span></a>Fixes and improvements</h2>
<ul>
<li>Shipped Elixir, Python, and Node SDKs for working with Knock</li>
<li>Shipped a login flow</li>
<li>Fixed a bug where environments wouldn't support consistently on the channel configuration page</li>
<li>Fixed a bug where batches we're being capped at five items</li>
<li>Fixed a bug where liquid conditionals weren't working in our email channels</li>
<li>Fixed a bug where feed items weren't always populating in real-time</li>
<li>Fixed a bug where the unseen badge wouldn't consistently disappear on feed open</li>
<li>Fixed a bug where failed emails were hanging in "queued" status</li>
<li>Fixed a bug where new workflows would default to status ON instead of status OFF</li>
<li>Added 'key' field to workflow page so it's easier to grab for use with the Knock API</li>
<li>Added support for password resets</li>
<li>Added relative timestamps to items in the Knock feed</li>
<li>Updated template editor so all edits trigger ability to commit changes to current environment</li>
</ul>
]]></content:encoded>
        </item>
    </channel>
</rss>