<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Features on Feasible</title>
    <link>https://feasible.lol/features/</link>
    <description>Recent content in Features on Feasible</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <atom:link href="https://feasible.lol/features/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The one-page dashboard</title>
      <link>https://feasible.lol/features/dashboard/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/features/dashboard/</guid>
      <description>&lt;p&gt;Six numbers. One graph. Five reports. Click any row to filter the page.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-six-numbers&#34;&gt;The six numbers&lt;/h2&gt;&#xA;&lt;p&gt;Unique visitors, total visits, total pageviews, views per visit, bounce rate,&#xA;visit duration. In that order, always.&lt;/p&gt;&#xA;&lt;p&gt;Click a tile to graph it. Press &lt;code&gt;I&lt;/code&gt; to switch between hourly, daily, weekly, and&#xA;monthly views. A period with no data shows a gap, not a false zero.&lt;/p&gt;&#xA;&lt;p&gt;Compare against the previous period or last year. Change markers appear on all&#xA;six tiles.&lt;/p&gt;</description>
    </item>
    <item>
      <title>No cookies, and no banner for most sites</title>
      <link>https://feasible.lol/features/privacy/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/features/privacy/</guid>
      <description>&lt;p&gt;Feasible sets no cookies on the sites it measures.&lt;/p&gt;&#xA;&lt;p&gt;The tracker writes two things into&#xA;&lt;code&gt;localStorage&lt;/code&gt;, and neither identifies anybody: &lt;code&gt;feasible_ignore&lt;/code&gt;, which you set&#xA;yourself to stop counting your own visits, and &lt;code&gt;feasible_outbox&lt;/code&gt;, the retry&#xA;queue that holds an event for a moment if the network drops it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-never-touches-disk&#34;&gt;What never touches disk&lt;/h2&gt;&#xA;&lt;p&gt;The visitor&amp;rsquo;s IP address.&lt;/p&gt;&#xA;&lt;p&gt;That isn&amp;rsquo;t a policy, it&amp;rsquo;s the shape of the pipeline. Geolocation and the visitor&#xA;hash both happen in the ingest tier - the only place the address exists - and&#xA;the address is discarded before anything is written. The durable event type has&#xA;nowhere to put one.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Goals, funnels and conversions</title>
      <link>https://feasible.lol/features/goals-and-funnels/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/features/goals-and-funnels/</guid>
      <description>&lt;p&gt;A goal is your definition of a win - a page reached, an event fired, a page&#xA;scrolled far enough. A funnel is two to eight of those goals in order, with the&#xA;drop-off between each step.&lt;/p&gt;&#xA;&lt;p&gt;Both live in the Behavior card at the bottom of&#xA;&lt;a href=&#34;https://feasible.lol/features/dashboard/&#34;&gt;the dashboard&lt;/a&gt;, and both are configured in site settings&#xA;or through &lt;a href=&#34;https://feasible.lol/features/api-and-webhooks/&#34;&gt;the API&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;three-kinds-of-goal&#34;&gt;Three kinds of goal&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Page goals&lt;/strong&gt; match a path, with wildcards - &lt;code&gt;/thanks&lt;/code&gt;, or &lt;code&gt;/docs/*&lt;/code&gt;. Up to&#xA;2,000 characters of pattern, which is more than anyone has ever needed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Custom events and properties</title>
      <link>https://feasible.lol/features/custom-properties/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/features/custom-properties/</guid>
      <description>&lt;p&gt;A custom event is one line of JavaScript:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;feasible(&lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#39;Signup&amp;#39;&lt;/span&gt;, { props&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;:&lt;/span&gt; { plan&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#39;scale&amp;#39;&lt;/span&gt;, trial&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#39;yes&amp;#39;&lt;/span&gt; } })&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The properties ride along with the event, and every report in Feasible can then&#xA;be broken down by them. What your application knows - plan, experiment variant,&#xA;article category, whether the visitor was logged in - becomes a dimension next&#xA;to browser and country.&lt;/p&gt;&#xA;&lt;p&gt;Pageviews take properties too. Same idea, &lt;code&gt;p&lt;/code&gt; instead of &lt;code&gt;props&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Revenue tracking</title>
      <link>https://feasible.lol/features/revenue/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/features/revenue/</guid>
      <description>&lt;p&gt;Any &lt;a href=&#34;https://feasible.lol/features/goals-and-funnels/&#34;&gt;goal&lt;/a&gt; can carry money. Mark it as a revenue&#xA;goal, pick a currency, and send the amount with the event:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;feasible(&lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#39;Purchase&amp;#39;&lt;/span&gt;, { revenue&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;:&lt;/span&gt; { amount&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;49.99&lt;/span&gt;, currency&lt;span style=&#34;color:#ff7b72;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a5d6ff&#34;&gt;&amp;#39;USD&amp;#39;&lt;/span&gt; } })&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You get total revenue, average revenue, and revenue per visitor. Break each one&#xA;down by any dimension.&lt;/p&gt;&#xA;&lt;h2 id=&#34;first-touch-attribution&#34;&gt;First-touch attribution&lt;/h2&gt;&#xA;&lt;p&gt;This is the decision that makes the report worth reading.&lt;/p&gt;&#xA;&lt;p&gt;Picture the sequence. Somebody clicks a link on Hacker News, reads for a while,&#xA;comes back the next morning, clicks buy, and gets redirected to a hosted&#xA;checkout page. Payment succeeds, they land back on your thank-you page, and the&#xA;referrer on that final pageview is your payment provider.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Teams, roles and shared dashboards</title>
      <link>https://feasible.lol/features/teams-and-sharing/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/features/teams-and-sharing/</guid>
      <description>&lt;p&gt;Every plan has unlimited teammates. Five roles cover the team. Two more cover&#xA;guests on one site.&lt;/p&gt;&#xA;&lt;h2 id=&#34;who-can-do-what&#34;&gt;Who can do what&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Owner&lt;/strong&gt; - everything, including deleting the team and transferring ownership.&#xA;There&amp;rsquo;s one, always.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Admin&lt;/strong&gt; - sites, settings, members and billing. Everything except ending the&#xA;team or handing it on.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Editor&lt;/strong&gt; - sites and site settings, no access to members or money.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Billing&lt;/strong&gt; - the dashboard and the billing screens. For the person who pays the&#xA;invoice and shouldn&amp;rsquo;t be able to delete a site.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reports and alerts</title>
      <link>https://feasible.lol/features/email-reports/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/features/email-reports/</guid>
      <description>&lt;p&gt;Schedule a report. Get an alert when traffic changes. Send either one by email,&#xA;Slack, or both.&lt;/p&gt;&#xA;&lt;h2 id=&#34;reports-on-your-schedule&#34;&gt;Reports on your schedule&lt;/h2&gt;&#xA;&lt;p&gt;A weekly report goes out at the site&amp;rsquo;s own local Monday 00:00. A monthly one at&#xA;local midnight on the 1st.&lt;/p&gt;&#xA;&lt;p&gt;That sounds like a detail and it&amp;rsquo;s the hard part. The job runs every hour and&#xA;asks each site whether its own clock has just crossed the boundary, which is the&#xA;only approach that works when one install serves sites in forty time zones - including the offsets that aren&amp;rsquo;t whole hours, and including the Sunday in March&#xA;when one of those hours doesn&amp;rsquo;t exist.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The data health panel</title>
      <link>https://feasible.lol/features/data-health/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/features/data-health/</guid>
      <description>&lt;p&gt;The health panel shows accepted, dropped, bot, and shortened events from the&#xA;last 24 hours. Every drop has a reason, such as &lt;code&gt;bot&lt;/code&gt;, &lt;code&gt;datacenter_ip&lt;/code&gt;,&#xA;&lt;code&gt;unknown_site&lt;/code&gt;, &lt;code&gt;hostname_not_allowed&lt;/code&gt;, &lt;code&gt;shield_page&lt;/code&gt;, or &lt;code&gt;invalid_payload&lt;/code&gt;.&#xA;There&amp;rsquo;s no miscellaneous bucket.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-last-request-we-received&#34;&gt;The last request we received&lt;/h2&gt;&#xA;&lt;p&gt;The panel prints the most recent request in full: the client IP we resolved,&#xA;&lt;strong&gt;which header we believed it from&lt;/strong&gt;, whether trusted proxies are configured,&#xA;the hostname, the path, the tracker version, the user agent, and what we did&#xA;with it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Filtering, shields and path cleaning</title>
      <link>https://feasible.lol/features/filters-and-shields/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/features/filters-and-shields/</guid>
      <description>&lt;p&gt;Three different tools that get confused with each other. Filters change the&#xA;report you&amp;rsquo;re looking at. Shields stop traffic being counted at all. Path&#xA;cleaning changes how URLs are grouped before either of those runs.&lt;/p&gt;&#xA;&lt;h2 id=&#34;filters&#34;&gt;Filters&lt;/h2&gt;&#xA;&lt;p&gt;Six operators, and that&amp;rsquo;s the complete list: is, is not, contains, does not&#xA;contain, matches regex, does not match regex.&lt;/p&gt;&#xA;&lt;p&gt;Repeated filters AND together. Several values inside one filter OR. You get up&#xA;to 32 filters at once, 1,000 values in any one of them, and five dimensions in a&#xA;single query - limits nobody has ever hit by clicking, and which exist so&#xA;&lt;a href=&#34;https://feasible.lol/features/api-and-webhooks/&#34;&gt;the API&lt;/a&gt; can&amp;rsquo;t be handed something that takes a&#xA;minute to answer.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Import your history, export everything</title>
      <link>https://feasible.lol/features/import-and-export/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/features/import-and-export/</guid>
      <description>&lt;p&gt;Import loose CSVs or a ZIP. Export one ZIP with ten reports and every raw event.&lt;/p&gt;&#xA;&lt;h2 id=&#34;bringing-history-in&#34;&gt;Bringing history in&lt;/h2&gt;&#xA;&lt;p&gt;Export your GA4 reports as CSV and upload the folder - pages, sources,&#xA;locations, devices and browsers land on the same charts as your live traffic,&#xA;dated where they belong. It&amp;rsquo;s the same path any other tool&amp;rsquo;s export takes.&lt;/p&gt;&#xA;&lt;p&gt;Import takes a ZIP or loose files. Recognized dimension columns cover page,&#xA;hostname, page title, event name, entry and exit page, referrer, source,&#xA;channel, the three UTM fields, country, region, city, device, screen size,&#xA;browser and version, operating system and version, and language. Metric columns&#xA;are visitors, visits, pageviews, events, bounces, exits, visit duration and time&#xA;on page. If your previous tool exports daily roll-up CSVs with columns named&#xA;like that, they come straight in.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The API, webhooks and MCP</title>
      <link>https://feasible.lol/features/api-and-webhooks/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/features/api-and-webhooks/</guid>
      <description>&lt;p&gt;Create one key for the stats API, site management, and webhooks. Add scopes when&#xA;you want less access. Keys belong to a team and stop working when their creator&#xA;leaves.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-you-can-do-with-it&#34;&gt;What you can do with it&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Read stats.&lt;/strong&gt; &lt;code&gt;POST /api/v2/query&lt;/code&gt; is the modern endpoint and it&amp;rsquo;s the same&#xA;query engine the dashboard runs on - fifteen metrics, every dimension, the same&#xA;six filter operators, up to 32 filters and five dimensions at a time. There are&#xA;also v1 endpoints for aggregate, timeseries, breakdown and realtime visitors if&#xA;you want a URL you can &lt;code&gt;curl&lt;/code&gt; without a JSON body.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why it&#39;s fast and small</title>
      <link>https://feasible.lol/features/speed/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/features/speed/</guid>
      <description>&lt;p&gt;&lt;strong&gt;3,377 bytes gzipped.&lt;/strong&gt; That&amp;rsquo;s the whole tracking script - 7,099 bytes before&#xA;compression, one request, cached for an hour.&lt;/p&gt;&#xA;&lt;p&gt;Measured against Google&amp;rsquo;s &lt;code&gt;gtag.js&lt;/code&gt; in September 2026, that&amp;rsquo;s about 43 times&#xA;smaller. The difference is a few hundred milliseconds on a slow phone. We&amp;rsquo;ll&#xA;take it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;a-hard-size-limit&#34;&gt;A hard size limit&lt;/h2&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a byte budget of 3,584 for the base script. Go over it and the build&#xA;exits 1 - enforced twice, once in the bundler and again in a Go test that reads&#xA;the shipped file.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
