Zapier
By ActivitySmith
Use the official PHP SDK to deliver immediate Push Notifications and Live Activity progress updates for long-running jobs and automation workflows.
composer require activitysmith/activitysmith<?phpuse ActivitySmith\ActivitySmith;$activitysmith = new ActivitySmith($_ENV['ACTIVITYSMITH_API_KEY']);Send an immediate notification for a completed task or event:

$activitysmith->notifications->send([ "title" => "New subscription 💸", "message" => "Customer upgraded to Pro plan",]);Send images, videos, or audio with your push notifications, press and hold to preview media directly from the notification, then tap through to open the linked content.

$activitysmith->notifications->send([ "title" => "Homepage ready", "message" => "Your agent finished the redesign.", "media" => "https://cdn.example.com/output/homepage-v2.png", "redirection" => "https://github.com/acme/web/pull/482",]);
.jpg, .png, .gif, etc..mp3, .m4a, etc..mp4, .mov, etc.Content-Type, even if the path has no extensionmedia can be combined with redirection, but not with actions.
Push notification redirection and actions are optional and can be used to redirect the user to a specific URL when they tap the notification or to trigger a specific action when they long-press the notification. Webhooks are executed by ActivitySmith backend.

$activitysmith->notifications->send([ "title" => "New subscription 💸", "message" => "Customer upgraded to Pro plan", "redirection" => "https://crm.example.com/customers/cus_9f3a1d", "actions" => [ [ "title" => "Open CRM Profile", "type" => "open_url", "url" => "https://crm.example.com/customers/cus_9f3a1d", ], [ "title" => "Start Onboarding Workflow", "type" => "webhook", "url" => "https://hooks.example.com/activitysmith/onboarding/start", "method" => "POST", "body" => [ "customer_id" => "cus_9f3a1d", "plan" => "pro", ], ], ],]);
There are three types of Live Activities:
metrics: best for live operational stats like server CPU and memory, queue depth, or replica lagsegmented_progress: best for step-based workflows like deployments, backups, and ETL pipelinesprogress: best for continuous jobs like uploads, reindexes, and long-running migrations tracked as a percentageWhen working with Live Activities via our API, you have two approaches tailored to different needs. First, the stateless mode is the simplest path - one API call can initiate or update an activity, and another ends it - no state tracking on your side.
This is ideal if you want minimal complexity, perfect for automated workflows like cron jobs.
In contrast, if you need precise lifecycle control, the classic approach offers distinct calls for start, updates, and end, giving you full control over the activity's state.
In the following sections, we'll break down how to implement each method so you can choose what fits your use case best.
Use a stable streamKey to identify the system or workflow you are tracking, such as a server, deployment, or build pipeline. This is especially useful for cron jobs and other scheduled tasks where you do not want to store activityId between runs.
Call stream(...) again with the same streamKey whenever the state changes.

$status = $activitysmith->liveActivities->stream('prod-web-1', [ 'content_state' => [ 'title' => 'Server Health', 'subtitle' => 'prod-web-1', 'type' => 'metrics', 'metrics' => [ ['label' => 'CPU', 'value' => 9, 'unit' => '%'], ['label' => 'MEM', 'value' => 45, 'unit' => '%'], ], ],]);
$activitysmith->liveActivities->stream('nightly-backup', [ 'content_state' => [ 'title' => 'Nightly Backup', 'subtitle' => 'upload archive', 'type' => 'segmented_progress', 'number_of_steps' => 3, 'current_step' => 2, ],]);
$activitysmith->liveActivities->stream('search-reindex', [ 'content_state' => [ 'title' => 'Search Reindex', 'subtitle' => 'catalog-v2', 'type' => 'progress', 'percentage' => 42, ],]);Use this when the tracked process is finished and you no longer want the Live Activity on devices. content_state is optional here; include it if you want to end the stream with a final state.
If you later send another stream(...) request with the same streamKey, ActivitySmith starts a new Live Activity for that stream again.
$activitysmith->liveActivities->endStream('prod-web-1', [ 'content_state' => [ 'title' => 'Server Health', 'subtitle' => 'prod-web-1', 'type' => 'metrics', 'metrics' => [ ['label' => 'CPU', 'value' => 7, 'unit' => '%'], ['label' => 'MEM', 'value' => 38, 'unit' => '%'], ], ],]);Stream responses include an operation field:
started: ActivitySmith started a new Live Activity for this streamKeyupdated: ActivitySmith updated the current Live Activityrotated: ActivitySmith ended the previous Live Activity and started a new onenoop: the incoming state matched the current state, so no update was sentpaused: the stream is paused, so no Live Activity was started or updatedended: returned by endStream(...) after the stream is endedUse these methods when you want to manage the Live Activity lifecycle yourself:
$activitysmith->liveActivities->start(...).activityId.$activitysmith->liveActivities->update(...) as progress changes.$activitysmith->liveActivities->end(...) when the work is finished.Use metrics when you want to keep a small set of live stats visible, such as server health, queue pressure, or database load.

$start = $activitysmith->liveActivities->start([ 'content_state' => [ 'title' => 'Server Health', 'subtitle' => 'prod-web-1', 'type' => 'metrics', 'metrics' => [ ['label' => 'CPU', 'value' => 9, 'unit' => '%'], ['label' => 'MEM', 'value' => 45, 'unit' => '%'], ], ],]);$activityId = $start->getActivityId();
$activitysmith->liveActivities->update([ 'activity_id' => $activityId, 'content_state' => [ 'title' => 'Server Health', 'subtitle' => 'prod-web-1', 'type' => 'metrics', 'metrics' => [ ['label' => 'CPU', 'value' => 76, 'unit' => '%'], ['label' => 'MEM', 'value' => 52, 'unit' => '%'], ], ],]);
$activitysmith->liveActivities->end([ 'activity_id' => $activityId, 'content_state' => [ 'title' => 'Server Health', 'subtitle' => 'prod-web-1', 'type' => 'metrics', 'metrics' => [ ['label' => 'CPU', 'value' => 7, 'unit' => '%'], ['label' => 'MEM', 'value' => 38, 'unit' => '%'], ], 'auto_dismiss_minutes' => 2, ],]);Use segmented_progress for jobs and workflows that move through clear steps or phases, such as backups, deployments, ETL pipelines, and checklists. number_of_steps is dynamic, so you can increase or decrease it later if the workflow changes.

$start = $activitysmith->liveActivities->start([ 'content_state' => [ 'title' => 'Nightly database backup', 'subtitle' => 'create snapshot', 'number_of_steps' => 3, 'current_step' => 1, 'type' => 'segmented_progress', 'color' => 'yellow', ], 'channels' => ['devs', 'ops'], // Optional]);$activityId = $start->getActivityId();
$update = $activitysmith->liveActivities->update([ 'activity_id' => $activityId, 'content_state' => [ 'title' => 'Nightly database backup', 'subtitle' => 'upload archive', 'current_step' => 2, ],]);
$end = $activitysmith->liveActivities->end([ 'activity_id' => $activityId, 'content_state' => [ 'title' => 'Nightly database backup', 'subtitle' => 'verify restore', 'current_step' => 3, 'auto_dismiss_minutes' => 2, ],]);Use progress when the state is naturally continuous. It fits charging, downloads, sync jobs, uploads, timers, and any flow where a percentage or numeric range is the clearest signal.

$start = $activitysmith->liveActivities->start([ 'content_state' => [ 'title' => 'EV Charging', 'subtitle' => 'Added 30 mi range', 'type' => 'progress', 'percentage' => 15, 'color' => 'lime', ],]);$activityId = $start->getActivityId();
$activitysmith->liveActivities->update([ 'activity_id' => $activityId, 'content_state' => [ 'title' => 'EV Charging', 'subtitle' => 'Added 120 mi range', 'percentage' => 60, ],]);
$activitysmith->liveActivities->end([ 'activity_id' => $activityId, 'content_state' => [ 'title' => 'EV Charging', 'subtitle' => 'Added 200 mi range', 'percentage' => 100, 'auto_dismiss_minutes' => 2, ],]);Just like Actionable Push Notifications, Live Activities can have a button that opens provided URL in a browser or triggers a webhook. Webhooks are executed by the ActivitySmith backend.

$start = $activitysmith->liveActivities->start([ 'content_state' => [ 'title' => 'Server Health', 'subtitle' => 'prod-web-1', 'type' => 'metrics', 'metrics' => [ ['label' => 'CPU', 'value' => 76, 'unit' => '%'], ['label' => 'MEM', 'value' => 52, 'unit' => '%'], ], ], 'action' => [ 'title' => 'Open Dashboard', 'type' => 'open_url', 'url' => 'https://ops.example.com/servers/prod-web-1', ],]);$activityId = $start->getActivityId();
$activitysmith->liveActivities->update([ 'activity_id' => $activityId, 'content_state' => [ 'title' => 'Reindexing product search', 'subtitle' => 'Shard 7 of 12', 'number_of_steps' => 12, 'current_step' => 7, ], 'action' => [ 'title' => 'Pause Reindex', 'type' => 'webhook', 'url' => 'https://ops.example.com/hooks/search/reindex/pause', 'method' => 'POST', 'body' => [ 'job_id' => 'reindex-2026-03-19', 'requested_by' => 'activitysmith-php', ], ],]);Keep your team aligned with immediate event delivery across incidents, business signals, and automation outcomes.
Connect ActivitySmith to automation and delivery platforms, then route runtime events to Push Notifications and Live Activities on your iOS devices.
By ActivitySmith
By ActivitySmith
By ActivitySmith
By ActivitySmith
By ActivitySmith
By ActivitySmith
By ActivitySmith

By ActivitySmith
By ActivitySmith
By ActivitySmith

By ActivitySmith
By ActivitySmith
By ActivitySmith
By ActivitySmith
By ActivitySmith
By ActivitySmith
By ActivitySmith
By ActivitySmith