<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: zacbuilds</title>
    <description>The latest articles on DEV Community by zacbuilds (@zacbuilds).</description>
    <link>https://dev.to/zacbuilds</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4085397%2Fb4833034-a1f6-4220-a010-3c6094dd7a87.png</url>
      <title>DEV Community: zacbuilds</title>
      <link>https://dev.to/zacbuilds</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zacbuilds"/>
    <language>en</language>
    <item>
      <title>Notavia is live: one API for email, in-app, SMS and chat, built .NET-first</title>
      <dc:creator>zacbuilds</dc:creator>
      <pubDate>Mon, 31 Aug 2026 10:14:20 +0000</pubDate>
      <link>https://dev.to/zacbuilds/notavia-is-live-one-api-for-email-in-app-inbox-sms-and-chat-built-net-first-2lmc</link>
      <guid>https://dev.to/zacbuilds/notavia-is-live-one-api-for-email-in-app-inbox-sms-and-chat-built-net-first-2lmc</guid>
      <description>&lt;p&gt;Disclosure first: I build Notavia.&lt;/p&gt;

&lt;p&gt;This is a launch post, but I’ll keep it practical: what it does, what’s actually live, and what isn’t.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem I kept re-solving
&lt;/h2&gt;

&lt;p&gt;Every SaaS app eventually needs notifications.&lt;/p&gt;

&lt;p&gt;It usually starts with "just send an email". Then you add retries, templates, provider credentials, delivery tracking, an in-app inbox, SMS, maybe Slack, and suddenly you have another subsystem to maintain.&lt;/p&gt;

&lt;p&gt;I’d built versions of this a few times already, so I stopped rebuilding it and turned it into one thing I could reuse.&lt;/p&gt;

&lt;p&gt;That became Notavia.&lt;/p&gt;

&lt;h2&gt;
  
  
  One call
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Notifications&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SendAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SendNotificationRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Channel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Recipient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Recipient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ada@example.com"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;TemplateKey&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"welcome"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;TemplateData&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Ada"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notavia handles the template, channel routing, provider call and delivery log. The idea is that your app says what to send and doesn’t need separate plumbing for every channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s live
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Email&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use your own SMTP/provider, or managed sending on paid plans. Custom sender domains, suppressions and unsubscribe handling are built in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In-app inbox&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Unread counts, history and mark-as-read, with real-time updates. For .NET there’s a Blazor component rather than a JS widget wrapped in C#.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SMS&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Twilio and Vonage using your own credentials. No managed SMS right now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chat&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Slack, Teams and Discord. Mostly useful for internal notifications and developer-facing products.&lt;/p&gt;

&lt;p&gt;Push isn’t live yet. It’s on the roadmap, but I’m not calling it done until certificate handling and TTL behavior are where I want them.&lt;/p&gt;

&lt;h2&gt;
  
  
  One template, multiple channels
&lt;/h2&gt;

&lt;p&gt;Templates use Liquid syntax and can render HTML, plain text and shorter message bodies depending on the channel.&lt;/p&gt;

&lt;p&gt;They’re editable at runtime too, so you can ship defaults and let tenant admins change their own copy without another deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The .NET-first part
&lt;/h2&gt;

&lt;p&gt;The API is REST, so you don’t need an SDK. But .NET is where I started because that’s the ecosystem I kept building this for.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SDKs for .NET, TypeScript, Python, Go and PHP&lt;/li&gt;
&lt;li&gt;Blazor inbox component with real-time updates&lt;/li&gt;
&lt;li&gt;MCP server for wiring notifications from AI coding tools&lt;/li&gt;
&lt;li&gt;Per-tenant sender domains on every plan, a branded in-app inbox from Growth, hosted unsubscribe pages; removing "Powered by Notavia" is Pro and up, or an €8/mo add-on on the lower plans&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;p&gt;Free forever at 1,000 email sends a month, no card required. On the free plan you bring your own provider keys and the free plan is email only: SMS starts on Starter (€18), the in-app inbox and Slack/Teams/Discord start on Growth (€73), and managed sending is on the paid plans.&lt;/p&gt;

&lt;p&gt;For the first 20 teams I’m also doing assisted onboarding and an architecture review, with Growth at the Starter price for the first 60 days.&lt;/p&gt;

&lt;p&gt;If you want that, reply here or email &lt;a href="mailto:hello@saas-infrastructure.com"&gt;hello@saas-infrastructure.com&lt;/a&gt; with "founding".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://saas-infrastructure.com/products/notify?utm_source=devto&amp;amp;utm_medium=launch&amp;amp;utm_campaign=launch-2026-08" rel="noopener noreferrer"&gt;https://saas-infrastructure.com/products/notify?utm_source=devto&amp;amp;utm_medium=launch&amp;amp;utm_campaign=launch-2026-08&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy to answer technical questions about it. Architecture, delivery flow, templates, Blazor, multi-tenancy, or anything I got wrong.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>showdev</category>
      <category>api</category>
    </item>
  </channel>
</rss>
