Foothint is Pulse for a small SaaS: every event, every account, quiet ones at the top. You send one request from your server. There is no website domain to connect.
Pulse is the home screen. Feed is the stream. Accounts is health, worst first. People, funnels, and alerts sit on top of the same events.
After you sign up you get a live key. Put it on the server. Then send an event. The row appears on Pulse immediately. You can paste this, or send it from the setup screen.
curl -X POST https://api.foothint.com/v1/log \
-H "Authorization: Bearer ft_live_..." \
-H "Content-Type: application/json" \
-d '{"channel":"auth","event":"User Signed Up"}'Health starts when the next request includes account_id. You do not need a separate identify call for the score to exist. Identify is only for a name, plan, email, or MRR you already know.
POST /v1/log
{ "channel": "payments", "event": "Invoice Paid", "account_id": "acme", "notify": true }
POST /v1/identify/user
{ "user_id": "usr_1", "email": "mia@acme.com", "account_id": "acme" }
POST /v1/identify/account
{ "account_id": "acme", "name": "Acme", "plan": "pro", "mrr": 99 }Live keys start with ft_live_. Test keys start with ft_test_. Copy them from setup or Settings.
Five channels. Name the event yourself. The first request creates the row.
| Channel | When |
|---|---|
| auth | Signed up, signed in, verified email |
| payments | Invoice paid, plan changed, subscription cancelled |
| activation | First real product action |
| usage | A recurring action you care about |
| errors | Checkout failed, a critical path broke |
Optional fields: user_id, account_id,description, tags, notify. Use notify only on the few events that should ping the team.
Health is a score on the account row. Under 50 is overdue. Silence is the mark. An account that goes quiet for 7 days can fire an alert on its own.
Put account_id on the event. That is enough to open the row. Name and MRR come later, from identify, if you have them.
A line was crossed, or an account went quiet. The note stays in the app. Slack is a URL in Settings. There is no mobile push.
Threshold: a count in an hour. Silence: days with no event. Spike: volume jumped. Milestone: an event hit a count.
Pick your stack. Copy the prompt. Paste it into Cursor, Claude, or any coding agent in your own repo.
This project is Next.js (App Router or Pages). Put the Foothint client in a server-only module. Call it from Server Actions, Route Handlers, or Route Handlers after auth callbacks. npm install @foothint/node.
Foothint is realtime product pulse and account health. You send events with an API key. Quiet accounts rise to the top of Pulse.
API key: read FOOTHINT_API_KEY from .env (never hardcode). Live keys start with ft_live_. Test keys start with ft_test_.
Node SDK:
npm install @foothint/node
import { Foothint } from "@foothint/node"
const fh = new Foothint({ apiKey: process.env.FOOTHINT_API_KEY })
await fh.log({
channel: "auth",
event: "User Signed Up",
description: optional one line,
icon: optional short mark,
userId: "usr_123",
accountId: "acc_456",
tags: { plan: "pro" },
notify: true
})
await fh.identify.user({ userId: "usr_123", email: "ali@acme.com", name: "Ali", accountId: "acc_456" })
await fh.identify.account({ accountId: "acc_456", name: "Acme Corp", plan: "pro", mrr: 99 })
Python:
from foothint import Foothint
fh = Foothint(os.environ["FOOTHINT_API_KEY"])
fh.log("auth", "User Signed Up", user_id="usr_123", account_id="acc_456", notify=True)
fh.identify_user("usr_123", email="ali@acme.com", name="Ali", account_id="acc_456")
fh.identify_account("acc_456", name="Acme Corp", plan="pro", mrr=99)
HTTP (any language):
POST {FOOTHINT_API_URL or https://api.foothint.com}/v1/log
Authorization: Bearer FOOTHINT_API_KEY
{ "channel": "auth", "event": "User Signed Up", "user_id": "usr_123", "account_id": "acc_456", "notify": true }
POST /v1/identify/user
{ "user_id": "usr_123", "email": "ali@acme.com", "name": "Ali", "account_id": "acc_456" }
POST /v1/identify/account
{ "account_id": "acc_456", "name": "Acme Corp", "plan": "pro", "mrr": 99 }
Channels to use: auth, payments, activation, usage, errors.
Your job: integrate Foothint into THIS repository. Do not create a demo app.
1. Add FOOTHINT_API_KEY (and FOOTHINT_API_URL if the SDK needs a base URL) to .env.example. Do not invent a live key.
2. Find the real auth, payment, and onboarding flows in this project.
3. After a successful signup or first login, call identify.user and identify.account, then log channel auth, event User Signed Up (or Signed In).
4. After a successful payment, subscription create, or plan change, log channel payments and identify.account with plan and mrr if you have them.
5. After the user finishes onboarding or sends a first meaningful action, log channel activation.
6. Log channel usage for a recurring product action (project created, API key created, first feature used).
7. Log channel errors when a checkout or critical path fails. notify: true on payments and errors.
8. Keep calls off the critical path if they can fail: catch errors, do not block the user.
9. Use the project's existing env, logging, and server-only patterns. No events from the browser unless this app already talks to Foothint from the client.