PostDeploy Start your 30-day free trial

Everything your software needs after deployment.

PostDeploy is the toolkit for operating software after it reaches production. Build elsewhere. Deploy anywhere. Run it with PostDeploy.

Try PostDeploy free for 30 days. No credit card.

Acme Dev Co / side-project
production ▾

This preview is clickable. Open a tool.

Fleet health

All reporting monitors are operational

Latest fleet evidence 2026-08-19 11:30:00 UTC

Active
3
Down
0
Paused
0
Waiting
0

HTTP monitor

https://api.side-project.dev/health

Up

Response time

api.side-project.dev

12:00 00:00 Now

Availability

Healthy for the full monitored window

Error overview

21 errors in this window

1 open issue across your Sources

Open issues
1
Events
21
Sources
1

production

side-project api

1 open issue v2.4.1

TypeError: fetch failed

worker/api, 3 events, first seen 2h ago, introduced by v2.4.1

Recent activity

21 errors in this window

Traffic overview

6,984 pageviews in this window

Top site side-project.dev

Pageviews
6,984
Visitors
4,330
Sites
1

production

side-project.dev

Receiving traffic

Traffic

Receiving traffic

Pageviews Visits

Recent activity

5984 pageviews in this window

Know that your site, API or scheduled job stopped, before a user tells you.

Nothing announces that a scheduled job stopped. It just stops. There is no failing request to catch, no error page and no exception, so the only observable fact is that nothing happened, and nothing is hard to notice.

PostDeploy inverts the alert for scheduled work: a heartbeat treats silence as the answer.

HTTP, keyword, TCP and DNS checks, plus SSL and domain expiry warnings, plus heartbeats for anything on a schedule. Uptime monitors and cron jobs have separate allowances, so watching a job never uses up a monitor.

Replaces your uptime monitor and your cron watchdog, which are usually two products with two meters.

See uptime and cron monitoring

Monitor

api.side-project.dev Up

Active incidents (1)

nightly-backup (Heartbeat monitor)

missed_heartbeat incident (production)

Started 2026-08-13 03:05:00 UTC, ongoing for 6d 9h

Down

Slack alert sent at 03:05, six days ago.

The alert you would have gotten, six days ago.

Find the deploy that broke it.

Errors arrive grouped into issues you can triage, not a feed of one-off events. Tag a release and PostDeploy tells you which deploy introduced the problem. Upload a sourcemap and a stack trace from a minified bundle reads like your source.

Replaces the error tracker you bolt on per project, priced per event on top of everything else.

See error tracking

Observe

Open TypeError: fetch failed

worker/api, 3 events, release v2.4.1

Read your visitor numbers without adding a consent banner.

Pageviews and custom events, no cookies, no raw IP stored, no persistent visitor identifier. The visitor hash uses a salt that rotates daily and is not reversible across days.

Replaces the analytics subscription, and the consent banner that comes with the free one.

See analytics

Measure

Pageviews Visits

6,984 pageviews, zero cookies

Wired up in one line per pillar

Create a project, then point each pillar at it. Setup happens once.

  1. 1 Create a project and copy its heartbeat URL.
  2. 2 Append one curl to the scheduled job.
  3. 3 PostDeploy alerts you when a ping does not arrive on time.

Errors and analytics take one line each: install @alplus/sdk from npm for a JavaScript app, or drop in the analytics script.

npm install @alplus/sdk

import { init, captureException, setUser } from "@alplus/sdk";

init({ key: process.env.POSTDEPLOY_API_KEY, release: "v2.4.1" });
setUser({ id: user.id });

try {
  await chargeCustomer(order);
} catch (error) {
  captureException(error); // grouped, tagged with the release
  throw error;
}

Published on npm. Errors arrive grouped into issues, tagged with the release that shipped them.

# application.ex: one child. Crashes report themselves.
children = [
  {AlplusSDK, []},
  MyAppWeb.Endpoint
]

# Capture a rescued exception yourself:
try do
  risky()
rescue
  exception ->
    AlplusSDK.capture_exception(exception, stacktrace: __STACKTRACE__)
end

# Ping a heartbeat when the nightly job finishes:
AlplusSDK.heartbeat("hb_YOUR_TOKEN", :finish)

The Elixir SDK attaches to the OTP logger, so unhandled crashes are captured without wrapping call sites.

# config/initializers/alplus.rb
Alplus.configure do |config|
  config.key = ENV["POSTDEPLOY_API_KEY"]
  config.environment = "production"
  config.release = "v1.2.3"
end

Alplus.capture_exception(exception)
Alplus.capture_message("import finished with 3 skips", level: "warning")

# Cron liveness from the job itself:
Alplus.heartbeat("hb_YOUR_TOKEN", state: "finish")

Rack middleware included; every capture is fail-safe and never raises into your app.

# Ping PostDeploy only if the job actually succeeded.
0 3 * * * /usr/local/bin/backup.sh && curl -fsS https://ingest.postdeploy.dev/h/hb_YOUR_TOKEN

No SDK at all: one curl in the crontab. Silence past the schedule pages you.

Cloudflare Amazon Web Services Elixir Ash Framework

Ship your next project with one toolkit, not three.

No credit card to start, and every feature on from the first minute. Pick Indie, Pro or Scale when the trial ends.

Start your 30-day free trial