Activity logs your whole team can read.

EZLogs captures requests, jobs, and database changes from your Rails or Next.js app, then turns them into plain-English actions anyone in your company can follow.

01The problem

One customer action, told two ways.

Same order. Same data. Toggle to see what your server says — and what your team needs.

[2026-05-10 14:02:11] Started POST "/orders" for 78.96.x.x at 14:02:11
[2026-05-10 14:02:11] Processing by OrdersController#create as HTML
[2026-05-10 14:02:11]   Parameters: {"cart_id"=>"92", "address_id"=>"341"}
[2026-05-10 14:02:11]   User Load (0.4ms)  SELECT "users".* WHERE "id" = $1
[2026-05-10 14:02:11]   Cart Load (0.6ms)  SELECT "carts".* WHERE "id" = $1
[2026-05-10 14:02:11]    (1.1ms)  BEGIN
[2026-05-10 14:02:11]   Order Create (2.3ms)  INSERT INTO "orders" (...) RETURNING "id"
[2026-05-10 14:02:11]   OrderItem Create (1.8ms)  INSERT INTO "order_items" ...
[2026-05-10 14:02:11]    (4.2ms)  COMMIT
[2026-05-10 14:02:11] [ActiveJob] Enqueued ChargeCardJob (jid=7b3...) to Sidekiq(default)
[2026-05-10 14:02:11] Redirected to /orders/1247
[2026-05-10 14:02:11] Completed 302 Found in 89ms (ActiveRecord: 9.4ms)
[2026-05-10 14:02:12] [Sidekiq] ChargeCardJob start jid=7b3...
[2026-05-10 14:02:12]   Payment Create (3.1ms)  INSERT INTO "payments" ...
[2026-05-10 14:02:13]   Order Update (1.4ms)  UPDATE "orders" SET "status" = $1 ...
[2026-05-10 14:02:13]   Inventory Update (0.9ms × 3)  UPDATE "inventories" SET "stock" ...
[2026-05-10 14:02:13] [ActionMailer] Delivered confirmation_email to maria.chen@example.com
[2026-05-10 14:02:13] [Sidekiq] ChargeCardJob done jid=7b3... 1.2s

Maria Chen placed an order for 3 books

Order #1247 Payment #884 Cart #92 ✓ Success · 1.34 s
Maria placed an order for 3 books totaling €47.20. Payment cleared on the first attempt, inventory was decremented for all three titles, a confirmation email was queued, and the warehouse was notified to begin packing.
  1. POST /orders — 200, 89 ms
  2. Order #1247 created
  3. Order Item ×3 created
  4. ChargeCardJob started
  5. Payment #884 — €47.20, succeeded
  6. Order #1247 — pending → paid
  7. Inventory ×3 — stock −1 each
  8. Email queued + warehouse notified

Both views describe the exact same order. One is what your server says. The other is what your team actually needs.

02How it works

Three sources of truth, stitched into one story.

Every customer action lives at the intersection of these three signals. EZLogs captures all three and links them automatically.

Every request

The intent: who clicked what, from where, with which result.

Every background job

The reaction: every charge, email, restock — linked to the request that started them.

Every database change

The truth: every row your app touched, with before and after values.

Drop in one gem or one npm package. Zero per-route code.

03The product

This is one customer placing an order.

Read it top to bottom. No log files, no grepping, no engineers needed. The live card below is real product UI.

Maria Chen placed an order for 3 books

Order#1247 Payment#884 Cart#92
Triggered by
Maria Chen
Started
Today, 14:02:11
Duration
1.34 s
Outcome
Success

Plain English

Maria placed an order for 3 books totaling €47.20. Payment cleared on the first attempt, inventory was decremented for all three titles, a confirmation email was queued for her account, and the warehouse was notified to begin packing. Estimated dispatch: tomorrow.

Business entities

Order ×1 Order Item ×3 Payment ×1 Shipment ×1 Inventory ×3
Show 13 events behind the scenes Hide events
  1. POST /orders — 200, 89 ms, Maria Chen
  2. Order #1247 created — status: pending
  3. Order Item ×3 created — Snow Crash, Babel, A Wizard of Earthsea
  4. Cart #92 emptied
  5. ChargeCardJob started
  6. Payment #884 created — amount: €47.20, status: succeeded
  7. Order #1247 updated — status: pending → paid
  8. Inventory ×3 updated — stock −1 each
  9. SendOrderConfirmationJob enqueued
  10. NotifyWarehouseJob enqueued
  11. Email queued — order_confirmation → maria.chen@example.com
  12. Shipment #311 created — status: pending
  13. Warehouse notified — channel: warehouse-east
04Install

Two stacks. One install.

Drop the agent in. Restart. Done. No per-route code, no SDK to learn.

terminal1 line
$ bundle add ez_logs_agent
config/initializers/ezlogs.rb3 lines
EzLogs.configure do |c|
  c.api_key = ENV["EZLOGS_API_KEY"]
end

Auto-captures HTTP, Sidekiq / ActiveJob, and ActiveRecord changes. Zero per-controller code.

terminal1 line
$ npm install @ezlogs/nextjs
next.config.ts2 lines
import { withEzlogs } from "@ezlogs/nextjs/build";
export default withEzlogs({ apiKey: process.env.EZLOGS_API_KEY });

Auto-captures HTTP, Server Actions, and Postgres changes (via triggers). Works with App Router, Pages Router, Turbopack, Webpack.

Read the full setup guide →

05Who it’s for

Built so anyone in your company can read it.

Engineers ship it. Founders, support, and PMs read it. One shared vocabulary for what the product is doing.

For founders

You can finally see what your product is actually doing without asking an engineer.

For support

You can finally answer "what happened to this order?" in seconds — not Slack threads.

For engineers

You can finally point your CEO at a link instead of explaining.

Not a metrics tool. Not a replacement for Datadog. A shared vocabulary for what your software does — for the people who built it and the people who didn’t.

06Pricing

Free during beta.

Unlimited events, unlimited team members, no card required. Beta accounts keep their free tier when we launch — forever.

07FAQ

Questions, answered.

The eight things people actually ask. Click any to expand.

What does EZLogs actually do?

It records every request, background job, and database change in your app, links them by user action, and turns each chain into one plain-English card — so anyone on your team can read what happened, not just the engineers.

Will it slow down my app?

No. The agent runs out-of-band: events are buffered in memory and shipped to EZLogs over a separate connection. If our service is down, the agent fails open and your app keeps running. Average overhead in benchmarks: under 1 ms per request.

What happens if EZLogs is down?

Your app keeps serving traffic. The agent buffers up to 10,000 events in memory and retries with exponential backoff. If the buffer overflows, it drops the oldest events — never the customer's request.

How is this different from Datadog, New Relic, or Honeycomb?

Those tools are for engineers, and they answer "is the system healthy?" EZLogs is for everyone, and it answers "what happened to my customer?" We don't compete with metrics. We're the layer above them.

Do you store my customer data?

We store the events your app sends us — request paths, job names, table names, and the before/after values you explicitly capture. We do not store request bodies, response bodies, or full database rows unless you opt in. Field-level redaction is on by default for any column matching password, token, secret, key, or *_at timestamps.

What languages and frameworks are supported today?

Ruby on Rails (Sidekiq, ActiveJob, ActiveRecord) and Next.js (App Router, Pages Router, Server Actions, Prisma, Drizzle, supabase-js, BullMQ, Inngest, Trigger.dev, Upstash, Supabase Queues). FastAPI is next.

Can I self-host?

Not yet. Self-host is on the post-launch roadmap. If self-hosting is a hard requirement for you, email us — we want to talk.

Is the AI explanation accurate?

The AI only writes sentences using the structured events your app actually sent. It never invents data. If it doesn't know, it says so. Every generated explanation is cached and reproducible — re-running the same action produces the same words.