Audit log
What the HotCodePush audit log records, the event types per object, how to filter it by object, actor, app and time, and how to download it as a CSV file.
The audit log records every change to your organization: who made it, with which credential and from where, on which object, with the object's fields. Rows are written on every plan and kept for the retention period. Owners and Admins read them where the plan includes it.
What is recorded
| Field | What it holds |
|---|---|
| Type | Holds object.action, such as release.created or channel.paused. The full list is under Event types. |
| Time | Holds when the change was made, in UTC. |
| Actor | Names the member who made the change, or system for an automatic change: auto-pause, channel and bundle expiry, the spending cap, a payment event. |
| Credential | Names the session the member was signed in with, or the API token that made the request, by id. |
| Place | Holds the country, the IP address and the user agent of the request. |
| Object | Names the organization, the app where there is one, and the id of the channel, release, bundle, member or other object the row is about. |
| Snapshot | Holds the object's fields worth reading at that moment, plus the changed fields for every updated type, never a bundle's file list and never a secret. |
A row is written together with the change, so a change without its record cannot exist. History outlives its objects: deleting an app, a channel or a release keeps every row about it.
A row names the object while it exists and shows its id afterwards. Only deleting the organization removes its rows.
Not recorded:
- Device reports and update outcomes, which are counted into each release's statistics.
- The single files of an upload, and an aborted upload.
- Reads such as the audience preview,
release create --dry-run,device probeand MCP tool calls. - Opening a checkout or the customer portal, and marking a notification read.
- Your own account's events, such as sign-ins, password and two-factor changes and API tokens, which belong to you and not to an organization.
Event types
| Object | Type | When |
|---|---|---|
| App | app.created | An app is created, with its default channel. |
app.deleted | An app is deleted. | |
app.restored | Support restores an app inside the seven-day window. | |
app.transferred | An app moves to another organization, one row per organization. | |
app.updated | The name, the default channel or a setting changes. | |
| Binary | binary.created | hotcodepush binary create registers a store build. |
binary.expired | No device has reported the build for the retention period. | |
| Bundle | bundle.deleted | A bundle is deleted. |
bundle.expired | Retention removes an unused bundle. | |
bundle.uploaded | An upload completes. | |
| Channel | channel.created | A channel is created. |
channel.deleted | A channel is deleted. | |
channel.expired | A preview channel is deleted past its expiry. | |
channel.paused | A channel is paused. | |
channel.resumed | A channel is resumed. | |
channel.updated | The name, a flag, the expiry or the auto-pause policy changes. | |
| Delivery | delivery.redelivered | A webhook's or the telemetry export's delivery is sent again from the console or the CLI. |
| Device | device.deleted | An erasure request deletes a device. |
| Invitation | invitation.accepted | An invitation is accepted. |
invitation.created | An invitation is sent. | |
invitation.revoked | An invitation is withdrawn. | |
| Member | member.joined | Single sign-on provisions a membership. |
member.removed | A member is removed or leaves. | |
member.role_changed | A role changes, the ownership transfer included. | |
| Organization | organization.created | The organization is created. |
organization.deleted | The organization is deleted. | |
organization.dormancy_noticed | 12 months pass without a device report or a sign-in. | |
organization.fair_use_warning | A fair-use warning is sent. | |
organization.limit_overridden | A limit is raised on request. | |
organization.restored | Support restores it inside the seven-day window. | |
organization.spending_cap_changed | The spending cap changes. | |
organization.spending_cap_reached | The month's MAU reaches the cap, or the cap is lowered below it. | |
organization.spending_cap_warning | The month's MAU crosses 80 percent of the cap. | |
organization.storage_limit_reached | An upload is refused by the organization's storage limit. Ask support to raise it. | |
organization.storage_limit_warning | An upload crosses the warning threshold below the organization's storage limit. Ask support to raise it. | |
organization.updated | The name or a security setting changes. | |
| Payment | payment.failed | The subscription is past due. The amount and the reason stay with the payment provider's own mail. |
| Release | release.created | A release is created from a path, a bundle, another channel or a rollback. |
release.failure_rate_exceeded | The auto-pause rule fires with the action set to notify. | |
release.paused | A person or auto-pause pauses it. | |
release.resumed | A release is resumed. | |
release.revoked | A person, a bulk revoke or auto-pause revokes it. | |
release.rollout_changed | The percentage changes, by a person or by progression. | |
release.updated | The notes, the mandatory flag or an auto-pause override changes. | |
| Signing key | signing_key.created | A signing key is registered. |
signing_key.deleted | A signing key is deleted. | |
| SSO provider | sso_provider.created | A provider is set. |
sso_provider.deleted | The provider is deleted. | |
sso_provider.updated | The provider changes. | |
sso_provider.verified | The domain verification succeeds. | |
| Subscription | subscription.cancellation_scheduled | A cancellation is scheduled, in the console or the customer portal. |
subscription.created | A subscription starts. | |
subscription.ended | The plan returns to Free. | |
subscription.uncanceled | A scheduled cancellation is withdrawn. | |
| Telemetry export | telemetry_export.created | The telemetry export is set. |
telemetry_export.deleted | The export is removed. | |
telemetry_export.disabled | Consecutive failed deliveries disable it. | |
telemetry_export.updated | The export is replaced or switched on or off, never a header value. | |
| Webhook | webhook.created | A webhook is created. |
webhook.deleted | A webhook is deleted. | |
webhook.disabled | Consecutive failed deliveries disable it. | |
webhook.updated | A webhook changes, never its secret. |
Events and payload lists the types a webhook can deliver, with each one's snapshot, and the ones that stay internal. The telemetry export carries every type.
The console page
The page is Audit logs under the organization, newest first. Each row shows the actor, the event, the object id, the app, the country and the time. A row opens its detail with the IP address, the user agent, the credential and the snapshot.
The Filter button offers four fields:
- Object narrows the log to one kind of object, every action on it, such as
channel.*. - Actor narrows it to System, or to a member found by email.
- App narrows it to one app, found by name.
- Time range narrows it to the last 7, 30 or 90 days.
Apply writes the filters into the page's URL, so a filtered view can be shared with another Admin.
The CSV download
Download CSV writes every row matching the current filters into audit-logs.csv, unpaginated, so a 12-month log downloads whole. The columns are id, createdAt, type, actorType, userId, appId, objectId, country, address, userAgent, sessionId, apiKeyId and snapshot, the snapshot as JSON. Together with the usage page's download and the complete listings of the API reference, it is the data export.
The API and the CLI
The rows are the audit-logs operations of the Swagger reference, newest first, with the console's filters by type, actor, user, app and time, the embedded app and user, the count and the CSV above. The CLI's hotcodepush audit-log list takes the same filters from the command line.
Both need a signed-in session or an OAuth access token, and an API token is refused with forbidden. Where the organization's plan does not include the audit log, every read answers plan_required with HTTP 402. The rows are written all the same, so upgrading shows the history from before the upgrade.
Last updated on
Analytics
What the analytics page of a HotCodePush app shows per channel and period, where every figure comes from, and how to read the same numbers from the CLI and the API.
Billing and MAU
How HotCodePush counts monthly active devices, what each plan costs, how the spending cap bounds the bill and what the invoice and a refund look like.