<?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>Forem: Clément Raul</title>
    <description>The latest articles on Forem by Clément Raul (@clment_raul_2c708fb7e5eb).</description>
    <link>https://forem.com/clment_raul_2c708fb7e5eb</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3291054%2F07dc213e-481b-4654-8de5-38a3220d1823.png</url>
      <title>Forem: Clément Raul</title>
      <link>https://forem.com/clment_raul_2c708fb7e5eb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/clment_raul_2c708fb7e5eb"/>
    <language>en</language>
    <item>
      <title>Improving our frontend tracking with Avo</title>
      <dc:creator>Clément Raul</dc:creator>
      <pubDate>Wed, 03 Dec 2025 14:08:23 +0000</pubDate>
      <link>https://forem.com/superpayments/improving-our-frontend-tracking-with-avo-50cc</link>
      <guid>https://forem.com/superpayments/improving-our-frontend-tracking-with-avo-50cc</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;This article explains how we’ve revamped our product analytics frontend tracking at Super using &lt;a href="https://www.avo.app/" rel="noopener noreferrer"&gt;Avo&lt;/a&gt; 📊. For a long time, we relied on Google Sheets to document frontend events, which led to unclear ownership, inconsistent schemas, and slow, manual QA in Segment. We’ve since moved to Avo’s Tracking Plan and Inspector, giving us a single source of truth, a proper branching and peer review process with developers, and automated validation. &lt;br&gt;
➡️ The result: cleaner data, faster debugging, and much smoother collaboration between data and engineering ✅.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Accurate tracking is essential for reliable data monitoring. It helps us confirm that newly released features work as expected, identify and fix bugs, and optimise key user journeys – for example, the funnel for the Super Credit application.&lt;/p&gt;

&lt;p&gt;When tracking goes wrong, the symptoms can vary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing events&lt;/li&gt;
&lt;li&gt;Missing properties&lt;/li&gt;
&lt;li&gt;Typos in property values&lt;/li&gt;
&lt;li&gt;Duplicate events being sent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;But the root cause is almost always the same: poor or missing documentation.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Our previous setup: Google Sheets as a tracking plan 📄
&lt;/h2&gt;

&lt;p&gt;Until recently, our main solution for documenting frontend tracking was Google Sheets. For each new feature, we would either create a new document or add a new tab listing all the events that needed to be tracked.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fglb9ysk7g56v8ucxi30l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fglb9ysk7g56v8ucxi30l.png" alt=" " width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What worked well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It was simple and familiar for everyone.&lt;/li&gt;
&lt;li&gt;The data team could quickly spin up a new sheet and share it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The data team was responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating and maintaining the event list&lt;/li&gt;
&lt;li&gt;Sending it to the dev team when new frontend tracking was required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, the limitations quickly became obvious.&lt;/p&gt;

&lt;p&gt;Key pain points ⚠️:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Poor versioning&lt;/strong&gt;: It was difficult to see when events had been removed or updated, and why.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unclear ownership&lt;/strong&gt;: Anyone could edit the sheet, and changes often went unnoticed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weak review process&lt;/strong&gt;: There was no clear “branching” or peer review flow before sending tracking specs to developers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No automated validation&lt;/strong&gt;: We had no way to systematically check that frontend tracking had been implemented correctly. Validating events in Segment’s debugger was manual, time-consuming, and especially painful for complex features like Super Credit with many different paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Little support for harmonisation&lt;/strong&gt;: There was nothing to enforce reuse of existing properties, ensure consistent property names/values across features, or keep our schema tidy over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because of these limitations, we decided to look for a better solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploring alternatives and discovering &lt;a href="https://www.avo.app/" rel="noopener noreferrer"&gt;Avo&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;One option we considered was documenting our tracking events in JSON files and using GitHub for version control, branching, and reviews. This would have been free and would have given us better structure, but it would also have been fairly developer-centric and not very user-friendly for non-engineers.&lt;/p&gt;

&lt;p&gt;After some research, we came across &lt;a href="https://www.avo.app/" rel="noopener noreferrer"&gt;Avo&lt;/a&gt;, a tool focused on frontend tracking schema management, observability, and monitoring.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.avo.app/" rel="noopener noreferrer"&gt;Avo&lt;/a&gt; offers two main components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tracking Plan&lt;/li&gt;
&lt;li&gt;Inspector&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Tracking Plan: a single source of truth 📘
&lt;/h2&gt;

&lt;p&gt;The Tracking Plan is where we define all the events sent from the frontend via Segment.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://www.avo.app/" rel="noopener noreferrer"&gt;Avo&lt;/a&gt;, events can be organised by category – for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App events&lt;/li&gt;
&lt;li&gt;Super Credit&lt;/li&gt;
&lt;li&gt;Merchant checkout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each event includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A clear definition of when the event is triggered&lt;/li&gt;
&lt;li&gt;The list of properties to send (e.g. brandId, pageName, memberId)&lt;/li&gt;
&lt;li&gt;The allowed values and formats for those properties, where relevant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkygr9dyw7g8a8k2bn5t7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkygr9dyw7g8a8k2bn5t7.png" alt=" " width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What &lt;a href="https://www.avo.app/" rel="noopener noreferrer"&gt;Avo&lt;/a&gt; improves:&lt;/p&gt;

&lt;p&gt;✅&lt;strong&gt;Single source of truth&lt;/strong&gt;: All frontend tracking specs live in one structured place instead of being scattered across multiple Google Sheets.&lt;/p&gt;

&lt;p&gt;✅&lt;strong&gt;Branching and reviews&lt;/strong&gt;: Adding or updating events happens via branches, similar to a development workflow. A contributor creates a branch, a peer reviews it, then it’s sent to developers for implementation and finally merged into the main frontend tracking plan once implemented.&lt;/p&gt;

&lt;p&gt;✅&lt;strong&gt;Better versioning&lt;/strong&gt;: It’s easy to see when events are created, changed, or archived.&lt;/p&gt;

&lt;p&gt;✅&lt;strong&gt;Consistency and harmonisation&lt;/strong&gt;: &lt;a href="https://www.avo.app/" rel="noopener noreferrer"&gt;Avo&lt;/a&gt; encourages consistent event naming and property reuse, and helps keep property values aligned across features.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Inspector: validating implementation automatically 🔎
&lt;/h2&gt;

&lt;p&gt;The second major feature we use is the Inspector.&lt;/p&gt;

&lt;p&gt;The Inspector connects Segment to &lt;a href="https://www.avo.app/" rel="noopener noreferrer"&gt;Avo&lt;/a&gt; so that &lt;a href="https://www.avo.app/" rel="noopener noreferrer"&gt;Avo&lt;/a&gt; can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read the events coming from the frontend&lt;/li&gt;
&lt;li&gt;Compare them against the definitions in the Tracking Plan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwf203rvm5n0c4kevqw9c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwf203rvm5n0c4kevqw9c.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is extremely useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checking that events have been implemented correctly 🤝&lt;/li&gt;
&lt;li&gt;Spotting typos in property names or values&lt;/li&gt;
&lt;li&gt;Ensuring that all required properties are being sent as defined&lt;/li&gt;
&lt;li&gt;What used to require manual QA in Segment’s debugger can now be done much more quickly and systematically.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How we are using &lt;a href="https://www.avo.app/" rel="noopener noreferrer"&gt;Avo&lt;/a&gt; today
&lt;/h2&gt;

&lt;p&gt;We started using &lt;a href="https://www.avo.app/" rel="noopener noreferrer"&gt;Avo&lt;/a&gt; in the context of the Super Credit features. It has already:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improved collaboration between the data team and developers&lt;/li&gt;
&lt;li&gt;Made it easier to review and refine frontend tracking specifications&lt;/li&gt;
&lt;li&gt;Helped us identify and fix tracking bugs more quickly and efficiently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the moment, we’re using the free version of &lt;a href="https://www.avo.app/" rel="noopener noreferrer"&gt;Avo&lt;/a&gt;, which comes with some limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A cap on the volume of events that Inspector can analyse per month (currently 100,000 events)&lt;/li&gt;
&lt;li&gt;Some paid features that we don’t yet have access to&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether upgrading to the paid version would be worth it is still under review.&lt;/p&gt;

&lt;p&gt;We are also in the process of migrating our legacy frontend tracking documentation. Around 80% of event definitions related to frontend checkout and Webflow (including Super Credit) have been moved from Google Sheets to &lt;a href="https://www.avo.app/" rel="noopener noreferrer"&gt;Avo&lt;/a&gt;. The next step is to complete the migration for app-related frontend events.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion 🎯
&lt;/h2&gt;

&lt;p&gt;Overall, our experience with &lt;a href="https://www.avo.app/" rel="noopener noreferrer"&gt;Avo&lt;/a&gt; has been extremely positive. It is user-friendly, has saved us significant time, and has improved collaboration both within the data team and between data and development.&lt;/p&gt;

&lt;p&gt;By moving away from ad-hoc Google Sheets towards a proper schema management and observability tool, we’ve made our tracking more reliable, our debugging faster, and our analytics more trustworthy – which ultimately helps us build and improve features like Super Credit with much more confidence.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>schema</category>
    </item>
    <item>
      <title>📈 Period-over-Period Measures in Looker: A Simpler, Better Way to Analyze Time Trends</title>
      <dc:creator>Clément Raul</dc:creator>
      <pubDate>Tue, 22 Jul 2025 12:50:48 +0000</pubDate>
      <link>https://forem.com/superpayments/period-over-period-measures-in-looker-a-simpler-better-way-to-analyze-time-trends-3le3</link>
      <guid>https://forem.com/superpayments/period-over-period-measures-in-looker-a-simpler-better-way-to-analyze-time-trends-3le3</guid>
      <description>&lt;p&gt;Tracking change over time—month-over-month, year-over-year—is essential for monitoring performance. Until recently, doing this in Looker meant relying on table calculations, which could be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hard to read and maintain&lt;/li&gt;
&lt;li&gt;Prone to human error&lt;/li&gt;
&lt;li&gt;Limited to visualization-only logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Looker's new period-over-period measures help bring time-based comparisons into LookML itself - making it easier to build reliable, reusable metrics. (&lt;a href="https://cloud.google.com/looker/docs/period-over-period" rel="noopener noreferrer"&gt;https://cloud.google.com/looker/docs/period-over-period&lt;/a&gt;)&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 Before: Table Calculations
&lt;/h2&gt;

&lt;p&gt;Previously, getting last year’s value for a metric required a &lt;strong&gt;workaround&lt;/strong&gt; like the following table calculation:&lt;br&gt;
&lt;code&gt;offset(${payment_transactions_fact.count_successful_transactions}, 12)&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjn3j01q1supp8k7s3dz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjn3j01q1supp8k7s3dz.png" alt=" " width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Limitations we encountered with this approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚠️ Only works in visualizations—can’t be filtered or reused elsewhere&lt;/li&gt;
&lt;li&gt;🧩 Logic cannot get duplicated across dashboards&lt;/li&gt;
&lt;li&gt;🔍 Harder to QA and understand over time&lt;/li&gt;
&lt;li&gt;📉 Fragile if the time grain or sort order changes&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  ✅ Now: LookML Period-over-Period Measures
&lt;/h2&gt;

&lt;p&gt;With the period_over_period measure type, we can now move this logic into our LookML layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Last Year’s Value&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;measure: count_successful_transactions_last_year {
  type: period_over_period
  description: "Successful transactions from the previous year"
  based_on: count_successful_transactions
  based_on_time: created_year
  period: year
  kind: previous
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example: Year-over-Year % Change&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;measure: count_successful_transactions_last_year_relative_change {
  type: period_over_period
  description: "Year-over-year % change in successful transactions"
  based_on: count_successful_transactions
  based_on_time: created_year
  period: year
  kind: relative_change
  value_format_name: percent_0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example: Looker Explore&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtl7e91d2spt1g4c53ik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtl7e91d2spt1g4c53ik.png" alt="Looker table" width="800" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Looker Visualisation&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1fs7nusggxraolhoyuu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1fs7nusggxraolhoyuu.png" alt="Looker visualisation" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🏢 How We Use It
&lt;/h2&gt;

&lt;p&gt;At Super, we’ve started using these measures to track key metrics like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 Sales – Year-over-year trends&lt;/li&gt;
&lt;li&gt;🧲 Customer and merchant retention – Month-over-month comparisons&lt;/li&gt;
&lt;li&gt;🚀 Feature impact – Week-over-week shifts after a product launch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because these are built into our LookML layer, they can be reused across different dashboards, which helps ensure consistency and saves time.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Why This Helps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Cleaner and centralized logic – Easier to review and test&lt;/li&gt;
&lt;li&gt;📊 Works across dashboards – Filterable, sortable, and visualization-friendly&lt;/li&gt;
&lt;li&gt;🔧 Adaptable – Supports different time periods (week, month, quarter, year)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This feature might seem small, but it's been a noticeable improvement for our data team. It reduces repetitive work, helps standardise time-based comparisons, and makes dashboards easier to maintain and trust.&lt;/p&gt;

</description>
      <category>data</category>
      <category>analytics</category>
      <category>looker</category>
    </item>
  </channel>
</rss>
