How to Set Up and Use Webhooks

Configure a webhook endpoint, understand the events and payloads PraisePal sends, and handle delivery retries.

Who can use this feature

  • Available on the Starter plan and above.

  • Requires the Super Admin admin permission.

PraisePal can push real-time event notifications to an HTTPS endpoint you control. Each delivery is a JSON POST with enough context for your system to log, alert, or trigger a downstream workflow.

What this is used for

Teams typically connect a webhook to:

  • Feed recognitions into reporting tools like Google Sheets or Airtable

  • Forward activity to messaging platforms that accept incoming webhooks (for example, Lark)

  • Trigger automations in no-code tools like Zapier or Make

  • Maintain an independent audit trail of recognition and incentive activity

You can point the webhook at an endpoint your engineering team builds, or at a no-code service that accepts HTTPS webhooks.

Setting up a webhook

  1. Go to Settings β†’ Integrations.

  2. Find the Webhook card.

  3. Paste your HTTPS endpoint URL into the Integration Endpoint field.

  4. Click Save.

PraisePal supports one webhook URL per workspace. Saving a new URL replaces the previous one. There is no verification request on save β€” the first real event triggers the first delivery.

There is currently no way to disconnect a webhook through the UI. To stop deliveries, replace the URL with a non-operational endpoint or contact Support.

Events and payloads

All configured events fire automatically to your endpoint β€” there is no way to subscribe selectively. PraisePal uses two payload shapes depending on the event family.

Recognition and comment events

Event β€” Fires when β€” `type` value in body

recognition.created

A user posts a recognition

Recognition

comment.created

A user comments on a recognition

Comment

Comments on celebration posts (birthdays, work anniversaries) do not trigger webhooks. Self-comments are also skipped.

Headers

Every delivery includes:

Content-Type

application/json

X-PraisePal-Event

Event name (for example recognition.created)

X-PraisePal-Delivery

Unique delivery ID (UUID) β€” stable across retries for the same event

Payload fields

All values are strings. The shape is identical for both recognition events.

id

Unique ID of the recognition or comment

giver_name

Person who gave the recognition or wrote the comment

recipients

Comma-separated recipient names (post author for comments)

type

Recognition or Comment

points

Points per recipient (0 for comments)

total_points

Total points across all recipients (0 for comments)

message

Body text

privacy

Public or Private

company_value

Company value name if attached; empty string otherwise

parent_recognition_id

Parent recognition ID for comments; empty string for recognitions

link

Direct link to the post in PraisePal

timestamp

Human-readable timestamp (e.g. Apr 20, 2026 2:30 pm)

Example: recognition

{ 
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", 
"giver_name": "Jonathan Vuk", 
"recipients": "Zelia Leong, Felix Tan", 
"type": "Recognition", 
"points": "50", 
"total_points": "100", 
"message": "Great work on the product launch!", 
"privacy": "Public", 
"company_value": "deliver-results", 
"parent_recognition_id": "", 
"link": "https://app.praisepal.com/ws/home?post_id=a1b2c3d4-e5f6-7890-abcd-ef1234567890&post_type=recognition", 
"timestamp": "Apr 20, 2026 2:30 pm" 
}

Example: comment

{ 
"id": "f9e8d7c6-b5a4-3210-fedc-ba9876543210", 
"giver_name": "Zelia Leong", 
"recipients": "Jonathan Vuk", 
"type": "Comment", 
"points": "0", 
"total_points": "0", 
"message": "Well deserved!", 
"privacy": "Public", 
"company_value": "", 
"parent_recognition_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", 
"link": "https://app.praisepal.com/ws/home?post_id=a1b2c3d4-e5f6-7890-abcd-ef1234567890&post_type=recognition", 
"timestamp": "Apr 20, 2026 2:45 pm" 
}

Private recognitions are included. Webhooks fire for both public and private recognitions. The privacy field tells you which kind it is, but the link opens the recognition for anyone who has it. Handle private links carefully and restrict access on your side.

Claim events

claim.submitted

An employee submits a claim on an active incentive program

claim.approved

An admin or program manager approves a pending claim

claim.rejected

An admin or program manager rejects a pending claim

Claim payloads use a structured JSON shape. The top-level type field matches the event name.

type

claim.submitted, claim.approved, or claim.rejected

workspace_id

Workspace UUID

program_id

Program UUID

program_name

Program display name

claim_id

Claim UUID

claimant

Object with workspace_user_id, name, and optional email

timestamp

Human-readable timestamp

proof

Submission proof text (claim.submitted only, when provided)

points

Points awarded (claim.approved only)

reviewed_by

Object with workspace_user_id and name (claim.approved and claim.rejected)

rejection_reason

Reason text (claim.rejected only, when provided)

Example: claim submitted

{ 
"type": "claim.submitted", 
"workspace_id": "00000000-0000-4000-8000-000000000001", 
"program_id": "11111111-1111-4111-8111-111111111111", 
"program_name": "Q2 learning workshop completion", 
"claim_id": "22222222-2222-4222-8222-222222222222", 
"claimant": { 
       "workspace_user_id": "33333333-3333-4333-8333-333333333333", 
       "name": "Ada Lovelace", 
       "email": "ada@example.com" 
    }, 
"proof": "Completed AWS Solutions Architect workshop on 12 Jun.", 
"timestamp": "Jun 12, 2026 3:15 pm" 
}

One-off program events

one_off.completed

An admin or program manager executes a one-off incentive program

type

one_off.completed

program_id

Program UUID

program_name

Program display name

message

Program message shown to recipients

points_per_recipient

Points each recipient received

recipients

Array of { workspace_user_id, name, points } objects

Example: one-off completed

{ 
"type": "one_off.completed", 
"program_id": "44444444-4444-4444-8444-444444444444", 
"program_name": "Q2 project completion bonus", 
"message": "Thank you for delivering the launch on time!", "points_per_recipient": 100, 
"recipients": [ { "workspace_user_id": "55555555-5555-4555-8555-555555555555", "name": "Felix Tan", "points": 100 } ] 
}

Delivery and retries

Your endpoint must respond with a 2xx status within 10 seconds. Any other response or a timeout counts as a failure.

Failed deliveries retry up to 3 attempts with exponential backoff β€” roughly 1 second, then 4 seconds, then 16 seconds between attempts. After the final attempt the delivery is marked as failed with no further retries.

There are no delivery logs in the PraisePal UI. Monitor success and failure on your side, using the X-PraisePal-Delivery header as a correlation ID.

Your endpoint may receive the same event more than once. Use the delivery ID or the payload id / claim_id to deduplicate.

Common issues

Webhook not firing after saving a URL β€” There is no test ping on save. Post a recognition in your workspace to trigger the first delivery and confirm your endpoint receives it.

Endpoint returns errors or times out β€” Ensure your endpoint responds within 10 seconds. If processing takes longer, acknowledge receipt immediately (return 200) and handle the work asynchronously.

Same event received more than once β€” PraisePal uses at-least-once delivery. Store the id from each payload and skip duplicates. The X-PraisePal-Delivery header stays the same across retry attempts for a given event.

Claim payloads look different from recognition payloads β€” Recognition and comment events use a flat string-keyed shape with a type of Recognition or Comment. Claim and one-off program events use structured JSON with a top-level type matching the event name (claim.submitted, one_off.completed, and so on). Branch on X-PraisePal-Event or the payload type field.

Related articles