OwlMetry

User Properties

Attach custom key-value metadata to users — subscription status, revenue, plan tier, and more.

User properties are custom key-value pairs stored on each user in OwlMetry. They let you see at a glance who is a paid subscriber, what plan they're on, how much they've spent, or any other user-level attribute you care about.

Properties are stored on the app_users table as a JSONB column and displayed in the Users list in the dashboard.

How It Works

Properties are merged, not replaced. When you set { plan: "premium" }, it merges with existing properties. Setting a value to an empty string "" deletes that key.

Existing:  { plan: "free", org: "acme" }
Set:       { plan: "premium", role: "admin" }
Result:    { plan: "premium", org: "acme", role: "admin" }

Setting Properties

From the SDK

Both the Swift and Node SDKs provide setUserProperties():

// Swift
Owl.setUserProperties(["plan": "premium", "org": "acme"])
// Node.js
const owl = Owl.withUser("user_123");
owl.setUserProperties({ plan: "premium", org: "acme" });

From Integrations

Third-party integrations like RevenueCat automatically sync subscription data into user properties via webhooks. See Integrations for setup.

Via the API

POST /v1/identity/properties
Authorization: Bearer owl_client_...

{
  "user_id": "user_123",
  "properties": {
    "plan": "premium",
    "org": "acme"
  }
}

Limits

LimitValue
Max properties per user50
Max key length50 characters
Max value length200 characters
Value typeStrings only

Properties vs Event Attributes

Use user properties for data that describes the user and changes infrequently (plan tier, subscription status, company name). Use event custom attributes for data specific to a single event (button clicked, page URL, error code).

User PropertiesEvent Attributes
ScopeUser-levelEvent-level
PersistenceStored on the user, visible in Users listStored on each event
UpdatesMerged on each callImmutable after ingest
Use caseSubscription status, plan tierAction details, error context

Identity Claim Merge

When an anonymous user is claimed via Owl.setUser(), properties from the anonymous user are merged into the real user. The real user's values take precedence on key conflicts.

Ready to get started?

Install the CLI and let your agent handle the rest.