# Send Paid Shopify Order Alerts to Your Team's Phones

> Use Shopify Flow's Order paid trigger, a stored webhook secret, and fixed privacy-minimal copy to notify one shared PingRoom Room.

- Published: 2026-10-23
- Author: PingRoom
- Category: Developers
- Topics: Shopify Flow push notification, Shopify paid order phone alert, Shopify automation notification
- Canonical: https://pingroom.io/blog/shopify-order-paid-push-notifications
- Cover image: https://pingroom.io/blog/shopify-order-paid-push-notifications-cover.webp
- Cover description: Two PingRoom avatars sort one blank paid-order token beside Pingo at a miniature fulfillment desk.

To send a paid Shopify order alert to a shared group of phones, start a Shopify Flow workflow with **Order paid**, then use **Send HTTP request** to post fixed, privacy-minimal copy to a PingRoom incoming webhook. Store the webhook URL as a Flow secret and derive the idempotency key from the order ID so a retry does not create another Ping.

This is a webhook recipe, not a native Shopify integration. Shopify remains the system of record for the order. PingRoom carries one selected state change to the people in a Room.

## Check whether Shopify's own alerts already fit

Shopify can already send new-order email notifications and Shopify mobile-app push notifications to eligible staff. Use those when the audience works in Shopify and needs its full order context.

Add a separate shared Room only when the alert belongs to a bounded operational group—such as the people preparing paid orders—and the lock screen should say only that an order is ready for review.

| Need                                                                 | Better starting point                                                                                                 |
| -------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| Store staff need a normal new-order alert in Shopify                 | [Shopify staff notifications](https://help.shopify.com/en/manual/fulfillment/setup/notifications/staff-notifications) |
| A group needs one minimal alert only after payment is confirmed      | The Flow recipe below                                                                                                 |
| The team needs customer, item, price, address, or fulfillment detail | Keep that detail in Shopify and open the order there                                                                  |
| Several systems must enrich, aggregate, or route each event          | Use a trusted relay or automation platform before PingRoom                                                            |

The distinction matters. Shopify's [**Order paid** trigger](https://help.shopify.com/en/manual/shopify-flow/reference/triggers/order-paid) runs when an order's payment status becomes paid. An authorized-only payment or a partially paid order does not trigger it. Payment capture, or marking an order as paid, can trigger the workflow. That is different from reacting to every new order.

## Prepare the Room and Shopify Flow

You need:

- a private PingRoom Room whose members should receive this operational signal;
- PingRoom Pro for the Room's incoming webhook;
- the [Shopify Flow app](https://help.shopify.com/en/manual/shopify-flow); and
- a Shopify Grow, Advanced, or Plus plan, because Shopify currently limits [**Send HTTP request**](https://help.shopify.com/en/manual/shopify-flow/reference/actions/send-http-request) to those plans.

In PingRoom, create or choose the Room, then add an incoming webhook under **Settings → Connections → From another app**. Copy the complete URL. The final path segment is a credential, so do not paste it into a note, code block, or workflow log. The [incoming-webhook walkthrough](/blog/webhook-to-push-notification) covers the Room-side setup.

In Shopify admin, open **Flow → Settings**, create a secret with the handle `pingroom_webhook_url`, and paste the complete PingRoom webhook URL as its value. Shopify says Flow secret values stay hidden in the interface and are redacted from run logs. Its [Liquid variable guide](https://help.shopify.com/en/manual/shopify-flow/getting-started/concepts/variables) documents secret and hashing syntax.

## Configure the exact Flow request

Create a workflow with the **Order paid** trigger. Add **Send HTTP request**, then enter these values:

| Field                        | Value                                                          |
| ---------------------------- | -------------------------------------------------------------- |
| HTTP method                  | `POST`                                                         |
| URL                          | `{{secrets.pingroom_webhook_url}}`                             |
| Header                       | `Content-Type: application/json`                               |
| Header                       | `Idempotency-Key: shopify-order-paid-{{ order.id \| sha256 }}` |
| On client error (4xx)        | `Fail`                                                         |
| On server error (5xx or 429) | `Retry`                                                        |

Use this body exactly:

```json
{
  "title": "Paid order ready",
  "message": "Open Shopify to review the order"
}
```

The message deliberately omits the customer name, order number, items, amount, delivery address, and links. Anyone who is allowed to act can open Shopify and use its permissions and audit trail. The phone alert provides a state change, not a copy of the order.

The `sha256` filter turns Shopify's stable order ID into a fixed ASCII value for the request header. It is not encryption and does not make order data safe to publish. Its job here is narrower: an exact Flow retry for the same paid-order event sends the same idempotency key and same body.

![Two PingRoom avatars separate one accepted blank order token from a duplicate while Pingo watches a locked secret capsule.](/blog/shopify-order-paid-push-notifications-1.webp)

The miniature scene is an example, not Shopify or PingRoom UI. [Pingo the Pigeon](/Pingo), PingRoom's fictional CMO, is watching the duplicate stay behind the divider. He cannot see the Flow secret, access a private Room, inspect an order, or send a Ping. People configure and own the workflow.

## Choose retry behavior deliberately

Shopify Flow treats 2xx and 3xx responses as success. It can retry configured 4xx, 5xx, and 429 responses for up to 24 hours, and it waits up to 30 seconds for a response.

For this recipe, **Fail** on 4xx. A missing field, invalid webhook path, or idempotency conflict usually needs a person to correct the configuration. Repeating the same bad request for a day does not help.

Use **Retry** for 5xx and 429. Those responses can represent temporary service trouble or PingRoom's cooldown. Because the event key and body stay stable, an exact replay can be acknowledged without creating a second Ping.

## Test four paths before activation

Use a test Room and a non-sensitive test order:

1. Run the workflow with a test order that reaches the paid state. Confirm that one Ping says only **Paid order ready** and **Open Shopify to review the order**.
2. Retry the captured HTTP action without changing its body or event identity. Confirm that the Room does not receive a second Ping.
3. In a controlled test, reuse the old key with changed copy. PingRoom should return `409 idempotency_conflict`, and Flow should record a client error rather than inventing a second event.
4. In a controlled test, temporarily use a deliberately invalid test webhook path that returns 404 and confirm that Flow fails the run. Restore the secret before activation.

Our recorded fixture renders the documented Liquid fields and sends the exact headers and body to a stateful local mock of PingRoom's webhook contract. It checks first acceptance, exact replay, changed-body conflict, and a disabled-webhook response. It does not use a live Shopify store, PingRoom Room, or phone, so the harmless end-to-end test still belongs in your own setup.

## Read the result correctly

HTTP `200` means PingRoom accepted and queued the Ping. It does not prove that every phone displayed it. Connectivity, operating-system notification permissions, Focus modes, battery settings, and Room preferences still affect delivery.

Shopify remains the durable order record. Check Flow's recent runs for workflow outcomes, and open Shopify for the order itself. For bursts, PingRoom's incoming webhook accepts one new Ping every five seconds by default and can return HTTP `429`; if paid orders frequently arrive faster than that, aggregate them in a relay instead of turning every event into an interruption.

Review the [complete webhook contract](/documents/webhooks) for current fields, limits, errors, cooldown behavior, and acknowledgements. The [incoming webhook feature page](/features/incoming-webhook) describes the supported Room connection without pretending it is a Shopify-native app.

When the four tests pass, [open PingRoom](/app/rooms), choose the destination Room, and activate only the paid-order signal that the group is prepared to act on.

_The two editorial illustrations were created with AI using approved PingRoom character references and reviewed by the PingRoom team._
