How Narrator Works

The Activity Stream
A single table to power your entire data system

Single source of truth

You don’t have to search through many tables or spend hours figuring out why numbers don’t match. All your company data is in one data model making it easy to find and always accurate.

Simple traceability

All reporting and analysis tables only depend on the Activity Stream and the Activity Stream is defined only from the raw data in your warehouse. There is no web of dependencies.

Minimal maintenance

Changes to BI tables (adding new columns, updating logic, etc.) can be done in a few clicks without adding any complexity to the definition.

Reinvented joins

Bridging data across systems doesn’t require custom engineering. You can bridge data from disparate systems thanks to Narrator’s innovation.

The Activity Stream

How it's built

The Activity Stream is a single 11-column data model that houses all your customer data in your warehouse.

Step 1

Define customer actions (activities) using simple SQL transformations

Logic is simple and easy to understand (~25 lines of code)
Activities are the building blocks that are used to assemble tables
All company definitions are managed in one place
Each activity follows a standardized structure so it can be added to the Activity Stream. For more information on the 11 columns that make up each activity check out our ‎docs.


SELECT              AS
  , o.created_at    AS ts
  , NULL            AS source
  , NULL            AS source_id
  ,         AS customer
  , 'completed_order' AS activity
  , d.code          AS feature_1 -- discount code
  , NULL            AS feature_2
  , NULL            AS feature_3
  , (o.total_price - o.total_discounts) AS revenue_impact
  , NULL            AS link
FROM shopify.order  AS o 
LEFT JOIN shopify.order_discount_code d
  ON (d.order_id =
  o.cancelled_at is NULL
  and is not NULL
SELECT                 AS activity_id
  , t.created_at       AS ts
  , 'zendesk'          AS source
  , t.submitter_id     AS source_id
  ,            AS customer
  , 'submitted_ticket' AS  activity
  , t.subject          AS feature_1 -- subject
  ,               AS feature_2 -- ticket_id
  , t.description      AS feature_3 -- description
  , NULL               AS revenue_impact
  , 'https://{COMPANYNAME}' ||  AS link
FROM zendesk.ticket AS t 
JOIN zendesk.user AS u
  ON ( = t.submitter_id)
WHERE t.subject <> 'SCRUBBED'
SELECT            AS activity_id
  , a.timestamp     AS ts
  , null            AS source
  , null            AS source_id
  , m.email_address AS customer
  , 'opened_email'  AS activity
  , c.title         AS feature_1 -- Campaign Name
  ,          AS feature_2 -- list name
  , c.type          AS feature_3 -- campaign type
  , NULL            AS revenue_impact
  , c.archive_url   AS link
FROM mailchimp.campaign_recipient_activity a 
JOIN mailchimp.member m
  ON ( = a.member_id and m.list_id = a.list_id)
JOIN mailchimp.list l
  ON ( = a.list_id)
JOIN mailchimp.campaign c
  ON ( = a.campaign_id)
WHERE a.action = 'open'
  p.message_id          AS activity_id
  , p.timestamp         AS ts
  , 'segment'           AS source
  , p.anonymous_id      AS source_id
  , p.user_id           AS customer
  , 'viewed_page'       AS activity
  , p.context_page_path AS feature_1
  , p.referrer          AS feature_2
  , NULL                AS feature_3
  , NULL                AS revenue_impact
  , p.context_page_url  AS link
FROM segment.pages p
New Activity created
Completed Order
Narrator Logo
Narrator inserts the activity data into your Activity Stream

Step 2

Narrator updates the Activity Stream using each SQL transformation

What Narrator does:
  • Uses the SQL definitions created by your data team
  • Applies robust identity resolution
  • Runs nightly reconciliation
  • Inserts and updates according to the schedule you set
  • Runs automated testing to notify if your data changes dramatically
Completed Order
Viewed Page
Submitted Ticket
Viewed Page
Viewed Page
Completed Order
Opened Email
Started Session
Recieved Email
Viewed Page
Viewed Page
Shipped Product

The Activity Stream

How it's used

The Activity Stream can be reassembled to generate any table for BI, reporting, and analysis.
Narrator’s core innovation is every data table can be constructed using a combination of activities and relationships between those activities.
Using the Narrator platform, quickly assemble any table to:
Answer any question
Materialize any table for reporting or BI
Build the dataset for your next analytics or data science project


Email Attribution

Q: How many orders are we driving through our emails?
Learn more about how these components generate queries in our docs.
Narrator Logo

Our Innovation

Built to solve data engineering, not manage it

The Narrator Platform

What you can do with it

Power your BI tools with tables built off the Activity Stream

  • Schedule and materialize tables directly to your warehouse
  • Speed up performance of your BI tools
  • All dashboards use the same source of truth so all numbers match

Build analyses and share insights via the platform

  • Create analyses using a storytelling format
  • Reproduce analyses easily
  • Monitor and snapshot analyses at specific moments in time

Manage your data system in one place

  • Use an automated world-class data engineering system
  • Identity resolution and reconciliation are applied for you
  • Full control over definitions and scheduling
"Having to not worry about the data engineering efforts involved with building out, scheduling, and maintaining materialized views is a tremendous value add from Narrator - it allows me, as an analyst, to focus my time on crafting and delivering insights to our organization."
Creative Market
Dylan Levan - Senior Marketing Analyst
Creative Market