Skip to content

Core Concepts

Pidgr is built around a few core concepts that work together to turn internal announcements into measurable, actionable campaigns.

A campaign is a structured communication sent to a targeted audience. Unlike email blasts or Slack messages, campaigns are tracked end-to-end with delivery confirmation and engagement metrics.

Each campaign has:

  • A name for internal identification
  • A title shown to recipients
  • A template that defines the message content
  • An audience of targeted users
  • A workflow that orchestrates the delivery lifecycle
  • A status tracking its progression (Draft → Active → Completed/Cancelled)
StatusDescription
CREATEDDraft campaign, not yet started
ACTIVERunning — notifications being sent, waiting for acknowledgments
COMPLETEDAll deliveries resolved (acknowledged, missed, or failed)
CANCELLEDManually stopped before completion

A workflow is a data-driven DAG (directed acyclic graph) that defines the steps a campaign follows. Workflows are not hardcoded — they are JSON definitions that the orchestration engine executes.

  1. SEND_NOTIFICATION — Deliver the push notification to all audience members
  2. DEADLINE_CHECK — Wait for a configurable period (e.g., 72 hours)
  3. SEND_REMINDER — Re-notify users who haven’t acknowledged
  4. MARK_MISSED — Mark remaining unacknowledged deliveries as missed
  5. CALL_WEBHOOK — POST delivery outcome data to a configured endpoint
TypePurpose
SEND_NOTIFICATIONSend push notifications with a template
DEADLINE_CHECKTimer that waits for a configured duration
SEND_REMINDERRe-send to users who haven’t acknowledged
MARK_MISSEDMark unacknowledged deliveries as missed
CALL_WEBHOOKPOST campaign results to an external URL

A template defines the message content delivered to recipients. Templates support Markdown formatting and variable interpolation.

Variables use {{variable_name}} syntax and are resolved at render time:

  • Audience variables — Per-user values provided when creating a campaign (e.g., {{name}}, {{department}})
  • Custom variables — Step-level values defined in the workflow (e.g., {{deadline}})

Templates are append-only versioned. Each edit creates a new version. Campaigns pin a specific template version at creation time, ensuring consistency even if the template is later modified.

An audience defines who receives a campaign. Audiences are composed from:

  • Groups — Named collections of users for cross-functional targeting (e.g., “Engineering”, “All Managers”)
  • Teams — Organizational units representing departments or divisions
  • Individual members — Specific users added directly

Each audience member can have per-user variables that personalize the template content for that recipient.

A delivery represents a single campaign message sent to one recipient. Each delivery tracks:

  • Status — Whether the recipient has acknowledged, missed, or failed to receive the message
  • Timestamps — When the notification was sent, read, and acknowledged
  • Actions — What the recipient did (e.g., acknowledged via the ACK button)
StatusDescription
PENDINGNotification queued but not yet sent
SENTPush notification delivered to the device
READUser opened the message in their inbox
ACKNOWLEDGEDUser performed the required action (e.g., tapped “Got it”)
MISSEDDeadline passed without acknowledgment
FAILEDDelivery failed (e.g., no registered device, push error)

An action is a user interaction with a delivered message. The primary action type is ACK (acknowledge), which signals that the recipient has read and understood the message.

Actions drive workflow progression — when a user acknowledges a delivery, the workflow records the action and evaluates the next step.

Pidgr uses role-based access control (RBAC). Each organization has:

  • System roles — Immutable roles seeded on organization creation (Super Admin, Admin, Manager, Member)
  • Custom roles — Organization-defined roles with configurable permissions

Permissions are granular and cover operations like managing campaigns, templates, members, teams, groups, roles, SSO, and API keys.