Skip to content

Activity Feed & Updates

Hardhat Flow tracks two distinct types of activity: ActivityLog (system-generated, immutable audit trail) and Updates (user-posted notes and photos). Both appear in context on bids and jobs. The Dashboard Feed aggregates relevant activity and alerts for each role.


ActivityLog (System-Generated)

The ActivityLog is an immutable, system-generated audit trail. Every significant change in the system automatically creates an ActivityLog entry. No user can edit or delete an ActivityLog record under any circumstance.

ActivityLog records are permanent. They cannot be edited, deleted, or soft-deleted — not even by Platform Admin.

What is Stored

Each ActivityLog entry contains:

Field Description
entity_type The type of object affected (e.g. bid, job, invoice, user).
entity_id The ID of the specific record affected.
action_type The category of change. See table below.
performed_by The user who triggered the action (or system for automated actions).
metadata A JSON object capturing the before/after diff of changed fields, or contextual data.
created_at UTC timestamp of when the action occurred.

Action Types

Action Type What Triggers It
status_change Any status transition on a bid, job, or invoice.
field_update A field value is changed on a bid, job, or invoice. Metadata contains a JSON diff.
assignment A worker or PM/Supervisor is assigned to or removed from a job.
blocked_change The blocked flag is set or cleared on a bid or job.
subcontractor_added A subcontractor is added to or removed from a job.
payment_recorded A payment is recorded against an invoice.
login A user successfully authenticates.
role_change A user's role is changed by an Owner or Platform Admin.
invoice_edit Any field on an invoice is modified after creation.
admin_action A Platform Admin performs an administrative operation (e.g. soft-delete, tenant provisioning).
tenant_provisioned A new tenant is created and its database provisioned.

Why it is Immutable

The ActivityLog is the system's legal and operational audit trail. It guarantees that:

  • Every change can be traced to a specific user and time.
  • No one can cover their tracks by deleting log entries.
  • Disputes about what happened — and when — can be resolved objectively.

Updates (User-Generated)

Updates are manual notes posted by users directly on a bid or job. They support free-text content and photo attachments.

Posting an Update

  • Any user with access to the bid or job can post an update.
  • Updates support text content and attached photos (see Photos).
  • Updates are not editable after posting in V1. If a mistake is made, a follow-up update should be posted for clarification.
  • Updates are not deleted — all deletes in the system are soft deletes, and Platform Admin must initiate them.

The no-edit policy on Updates ensures a trustworthy record of communications and observations on a project.

Who Can See Updates

  • All users assigned to the relevant bid or job can see updates posted on that entity.
  • Owner can see all updates across all entities.
  • Accounting can view updates on invoices and jobs but not post to them directly.

Dashboard Feed

The Dashboard Feed is the landing page for all users. It shows a role-scoped stream of recent activity and active alerts.

Role-Scoped Visibility

Sees everything: all bids, all jobs, all alerts across the entire tenant. Full picture of operations.

Sees activity and alerts for bids and jobs where they are the assigned PM — their full hierarchy.

Sees activity and alerts only for jobs where they are the assigned Supervisor.

Sees invoice-related activity and status changes. No operational alerts.

Does not have a dashboard feed. Sees only their assigned job list.

Alerts Panel

The dashboard surfaces three categories of alerts prominently:

Alert Type Trigger Who Sees It
Priority Any bid or job with priority = true. Owner (all), PM (their items), Supervisor (their jobs).
Blocked Any bid or job with blocked = true. Owner (all), PM (their items), Supervisor (their jobs).
Stale Jobs Any In Progress job with no status change beyond the stale threshold (default: 14 days). Owner (all), PM (their items).

The stale job threshold is configurable per tenant in CompanySettings. The default is 14 days of inactivity.