diff --git a/README.md b/README.md index 0bdca29..49ed754 100644 --- a/README.md +++ b/README.md @@ -12,13 +12,11 @@ SPDX-License-Identifier: Apache-2.0 > /rəˈflek(t)/
> _To embody or represent in a faithful or appropriate way_ -`reflekt` helps Data, Engineering, and Product teams by providing tooling and a shared process to define, manage, and model event data for product analytics. -- Configure conventions for events and properties. Enforced by `reflekt lint`. -- Define events using [JSON schema](https://json-schema.org/), creating a codified, version controlled spec for event instrumentation. -- `reflekt push` event schemas to a registry to validate events as they flow from **Application -> Registry -> Customer Data Platform (CDP) -> Data Warehouse**. -- Automate the creation of private dbt packages with sources, staging models, and documentation for event data with `reflekt build --artifact dbt`. - -The `reflekt` CLI integrates with [Customer Data Platforms (CDPs)](#customer-data-platform-cdp), [Schema Registries](#schema-registry), [Cloud data Warehouses](#cloud-data-warehouse), and [dbt](#dbt). +`reflekt` helps Data, Engineering, and Product teams by providing tooling and a shared process to define, manage, and model event data for product analytics. The `reflekt` CLI integrates with [Customer Data Platforms](#customer-data-platform-cdp) (CDPs), [Schema Registries](#schema-registry), popular [Data Warehouses](#cloud-data-warehouse), and [dbt](#dbt). +- Configure and enforce event naming conventions with `reflekt lint`. +- Define events with [JSON schema](https://json-schema.org/) for a codified, version controlled spec for event instrumentation. +- `reflekt push` event schemas to a registry for validation as they flow from `App -> Registry -> CDP -> Data Warehouse`. +- Automagically build a private dbt package to model, document, and test events with `reflekt build --artifact dbt`. https://user-images.githubusercontent.com/28986302/217134526-df83ec90-86f3-491e-9588-b7cd56956db1.mp4 @@ -56,14 +54,15 @@ my-reflekt-project ``` ### Configure a Reflekt Project -Reflekt uses 3 configuration files (see the table below) +Reflekt uses 3 files to define and configure a Reflekt project. | Configuration File | Purpose | |----------------------------------|---------| | `reflekt_project.yml` | Project settings, event and property conventions, data artifact generation,
additional Avo registry config (optional) | | `reflekt_profiles.yml` | Connection details to schema registries and cloud data warehouses. | | `schemas/.reflekt/meta/1-0.json` | Meta-schema used to:
1. Events in `schemas/` follow the Reflekt format.
2. Define global `"metadata": {}` requirement for all schemas. | -Example configurations for each file in the table above can be found below (click to expand). +> [!TIP] +> Click the example configuration files below to see their structure and settings.
Example: reflekt_project.yml @@ -224,88 +223,132 @@ dev_reflekt: # Profile name (multiple pr
### Defining Event Schemas -Event schemas are defined using [JSON schema](https://json-schema.org/) specification, stored in the `schemas/` directory of a Reflekt project. Click to expand the `ProductClicked` event schema example below. +Events in a Reflekt project are defined using the [JSON schema](https://json-schema.org/) specification and are stored in the `schemas/` directory of the project. + +> [!TIP] +> Click to expand the `Order Completed` example below.
-Example: my-reflekt-project/schemas/segment/ecommerce/ProductClicked/1-0.json(CLICK TO EXPAND) +Example: my-reflekt-project/schemas/jaffle_shop/Order_Completed/1-0.json
```json { - "$id": "segment/ecommerce/ProductClicked/1-0.json", // Unique ID for the schema - "$schema": "http://json-schema.org/draft-07/schema#", // JSON Schema version - "self": { - "vendor": "com.company_name", // Company, application, team, or system that authored the schema - "name": "ProductClicked", // Name of the event - "format": "jsonschema", // Format of the schema - "version": "1-0", // Version of the schema - "metadata": { // Metadata for the event - "code_owner": "engineering/ecommerce-squad", - "product_owner": "product_manager_name@company_name.com", - } - }, - "type": "object", - "properties": { // Properties of the event - "product_id": { - "type": "string", - "description": "Database id of the product being viewed" - }, - "sku": { - "type": "string", - "description": "Sku of the product being viewed" - }, - "category": { - "type": "string", - "description": "Category of the product being viewed" - }, - "name": { - "type": "string", - "description": "Name of the product being viewed" - }, - "brand": { - "type": "string", - "description": "Brand of the product being viewed" - }, - "variant": { - "type": "string", - "description": "Variant of the product being viewed" - }, - "price": { - "type": "number", - "description": "Price of the product ($) being viewed" - }, - "quantity": { - "type": "integer", - "description": "Quantity of the product being viewed" - }, - "coupon": { - "type": "string", - "description": "Coupon code associated with a product (for example, MAY_DEALS_3)" - }, - "position": { - "type": "integer", - "description": "Position in the product list (ex. 3)" - }, - "url": { - "type": "string", - "description": "URL of the product being viewed" - }, - "image_url": { - "type": "string", - "description": "URL of the product image being viewed" - }, - }, - - "required": [ // Required properties - "product_id", - "sku", - "category", - "name", - "brand", - "price", - "quantity" - ], - "additionalProperties": false, // No additional properties allowed + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "jaffle_shop/Order_Completed/1-0.json", // Unique ID for schema (relative to `schemas/` dir) + "description": "User completed an order (i.e., user confirmed and payment was successful).", + "self": { + "vendor": "com.thejaffleshop", // Company, application, team, or system that authored the schema + "name": "Order Completed", // Name of the event + "format": "jsonschema", // Format of the schema + "version": "1-0", // Version of the schema + "metadata": { // Metadata for the event + "code_owner": "@the-jaffle-shop/frontend-guild", + "product_owner": "pmanager@thejaffleshop.com", + } + }, + "type": "object", + "properties": { + "coupon": { + "description": "Coupon code used for the order.", + "type": [ + "string", + "null" + ] + }, + "currency": { + "description": "Currency for the order.", + "type": "string" + }, + "discount": { + "description": "Total discount for the order.", + "type": "number" + }, + "order_id": { + "description": "Unique identifier for the order.", + "type": "string" + }, + "products": { + "description": "List of products in the cart.", + "items": { + "additionalProperties": false, + "properties": { + "category": { + "description": "Category of the product.", + "type": "string" + }, + "name": { + "description": "Name of the product.", + "type": "string" + }, + "price": { + "description": "Price of the product.", + "type": "number" + }, + "product_id": { + "description": "Unique identifier for the product.", + "type": "string" + }, + "quantity": { + "description": "Quantity of the product in the cart.", + "type": "integer" + }, + "sku": { + "description": "Stock keeping unit for the product.", + "type": "string" + } + }, + "required": [ + "product_id", + "sku", + "category", + "name", + "price", + "quantity" + ], + "type": "object" + }, + "type": "array" + }, + "revenue": { + "description": "Total revenue for the order.", + "type": "number" + }, + "session_id": { + "description": "Unique identifier for the session.", + "type": "string" + }, + "shipping": { + "description": "Shipping cost for the order.", + "type": "number" + }, + "subtotal": { + "description": "Subtotal for the order (revenue - discount).", + "type": "number" + }, + "tax": { + "description": "Tax for the order.", + "type": "number" + }, + "total": { + "description": "Total cost for the order (revenue - discount + shipping + tax = subtotal + shipping + tax).", + "type": "number" + } + }, + "required": [ + "session_id", + "order_id", + "revenue", + "coupon", + "discount", + "subtotal", + "shipping", + "tax", + "total", + "currency", + "products" + ], + "additionalProperties": false } ```