WooCommerce order notifications with Honk Me

Updated 6 October 2026 4 min read

WooCommerce emails you about new orders, and those emails share an inbox with everything else. Most shop owners want two things on their phone instead: a short note for every paid order, and a loud alert when payments start failing, before customers give up.

The Honk Me plugin for WordPress sends both, without code. It also covers refunds, stock, new customers, reviews, form entries, sign-ins and site health, and one settings screen lets you choose what each notification says.

Before you start

  • A Honk account. Honk is invite-only for now: request access.
  • A project for the shop, for example “Shop”.
  • WordPress 6.4 or later with PHP 7.4 or later. WooCommerce is optional: without it, you still get sign-ins, site health, comments and forms.

1. Install the plugin

The plugin is coming to the WordPress plugin directory, where it’s in review now. Once it’s listed, open Plugins ▸ Add Plugin in WordPress, search for Honk Me, then click Install Now and Activate. Until then, use one of the setups under “Without the plugin” at the end of this guide.

Nothing is sent before you add a key, so you can install it on a live shop.

2. Connect it to Honk

In the Honk web app, open the shop’s project, go to Keys and create a key. Copy it right away: Honk shows it only once.

In WordPress, open Settings ▸ Honk and paste the key into API key. Leave the server URL as it is unless you run your own Honk server, and click Save Changes.

3. Choose what you hear about

Under Events, every event has its own switch, a level on the Honk scale and a priority. The defaults are a good start: a paid order is a Beep-beep, a failed payment a Loud honk, and a product that runs out a Long honk.

The WooCommerce events in Settings ▸ Honk, each with a switch, a level and a priority.

Honk groups repeats, so 30 failed payments in an hour are one episode with a counter, not 30 pushes. Things that start and stop, like low stock or a wave of failed sign-ins, also send an all-clear when they’re over.

4. Choose what each notification says

Click Details under an event to see what its notification can say. A new order always has its number and a link to the order in WordPress. The rest are checkboxes: the total, the number of items, the status, the payment and shipping method, the first three products, and the customer’s name, email, phone, billing city and note. The preview next to them shows how the notification will read in Honk, and it changes as you tick.

The details of “New order”: the checkboxes, and the preview of the notification.

The customer’s details are personal data, so they’re sent only while Include customer names and emails is on, under Privacy and language. While it’s off, they’re greyed out and nothing personal goes out, whatever is ticked. For Contact Form 7, WPForms and Gravity Forms, you can also leave out single fields of each form.

Click Save Changes when you’re done.

5. Send a test

Back at the top of Settings ▸ Honk, click Send test notification. It uses the key in the field, even before you save, and shows Honk’s answer right below. The test reaches your Honk inbox within seconds.

The answer to “Send test notification”: it works, with the message ID.

To see a real order, place one with a payment method such as cash on delivery. Settings ▸ Honk ▸ Delivery log lists every notification the site has sent, with its status.

Quiet nights for the shop

Orders at 3 a.m. are good news that can wait. In the Honk web app, open the shop’s project ▸ My notifications and set quiet hours; you get one summary in the morning. Or set your push threshold to High: paid orders then wait for the digest, while a product that runs out still pushes right away, because a Long honk is always at least High. To have failed payments push too, set their priority to High under Events.

About customer data

With the plugin’s defaults, notifications carry no personal data: an order reads “Order #1234 · €84.00 · 2 items”. Names, emails and the rest go out only when you turn them on, and only the ones you tick. Honk keeps messages for 3, 14 or 30 days, depending on your plan, and uses them only to show them to you. The plugin also suggests a paragraph for your privacy policy, under Settings ▸ Privacy in WordPress.

Without the plugin

While the plugin is in review, or if you’d rather not install one, two other ways work too.

A workflow tool. WooCommerce can send every order to a webhook, in its own format. Put n8n, Make or Zapier in between to pick the fields and send them to Honk. With n8n and the Honk node:

WooCommerce ▸ Settings ▸ Advanced ▸ Webhooks ▸ Add webhook
  Status:        Active
  Topic:         Order updated
  Delivery URL:  https://your-n8n.example.com/webhook/woocommerce

n8n workflow
  1. Webhook (POST /webhook/woocommerce)
  2. If: {{ $json.body.status }} is "processing"
  3. Honk → Send message
       Message:   {{ $json.body.billing.first_name }} {{ $json.body.billing.last_name }}: {{ $json.body.line_items.map(i => i.quantity + ' × ' + i.name).join(', ') }}
       Title:     New order #{{ $json.body.number }} · {{ $json.body.total }} {{ $json.body.currency }}
       Severity:  Beep-Beep (Success)
     Additional Fields
       Category:   Sales
       Group Key:  orders/{{ $json.body.id }}
     Options
       Idempotency Key: wc-{{ $json.body.id }}-paid

In Make or Zapier, use their HTTP module with the same fields; the forms guide shows one filled in.

A few lines of code. Put the key in wp-config.php, where it stays out of content exports and backups:

// wp-config.php, above the line "That's all, stop editing!"
define('HONK_KEY', 'honk_…');

Then create wp-content/mu-plugins/honk.php with a small helper. WordPress loads must-use plugins by itself, and 'blocking' => false means checkout never waits for Honk:

<?php
/*
 * Plugin Name: Honk notifications
 * Description: Sends store and form events to Honk (honk-me.app). Not an official Honk plugin: a starting point to adapt.
 */

// Sends one event to Honk without slowing the page down. The key comes from wp-config.php.
function honk_send(array $event, string $idempotency_key): void
{
    if (!defined('HONK_KEY')) {
        return;
    }
    // Honk accepts https links only; drop the link on an http:// development site
    if (isset($event['url']) && !str_starts_with($event['url'], 'https://')) {
        unset($event['url']);
    }
    $event['message'] = mb_strcut($event['message'], 0, 8000); // a message holds up to 8192 bytes
    wp_remote_post('https://honk-me.app/v1/messages', [
        'timeout' => 5,
        'blocking' => false, // fire and forget: checkout never waits for Honk
        'headers' => [
            'Authorization' => 'Bearer ' . HONK_KEY,
            'Content-Type' => 'application/json',
            'Idempotency-Key' => $idempotency_key,
        ],
        'body' => wp_json_encode($event),
    ]);
}

Add the order events to the same file. Each one has an idempotency key built from the order, so a retried hook never notifies you twice:

// A paid order: a Beep-beep with what was bought.
add_action('woocommerce_payment_complete', function ($order_id) {
    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }
    $items = [];
    foreach ($order->get_items() as $item) {
        $items[] = $item->get_quantity() . ' × ' . $item->get_name();
    }
    honk_send([
        'title' => sprintf('New order #%s · %s %s', $order->get_order_number(), $order->get_total(), $order->get_currency()),
        'message' => $order->get_formatted_billing_full_name() . "\n" . implode("\n", $items),
        'severity' => 'beep',
        'category' => 'sales',
        'source' => 'woocommerce',
        'group_key' => 'orders/' . $order->get_id(),
        'url' => $order->get_edit_order_url(),
    ], 'wc-' . $order->get_id() . '-paid');

    // the gateway works again after a failure: close that incident
    $gateway = $order->get_payment_method();
    if (get_transient('honk_failed_' . $gateway)) {
        delete_transient('honk_failed_' . $gateway);
        honk_send([
            'title' => sprintf('Payments via %s work again', $order->get_payment_method_title()),
            'message' => sprintf('Order #%s was paid.', $order->get_order_number()),
            'event_type' => 'recovery',
            'category' => 'payments',
            'source' => 'woocommerce',
            'group_key' => 'payments/' . $gateway,
        ], 'wc-' . $order->get_id() . '-gateway-ok');
    }
});

// A failed payment: one group per payment method, so a broken gateway is one incident, not 30 pushes.
add_action('woocommerce_order_status_failed', function ($order_id, $order) {
    $gateway = $order->get_payment_method();
    set_transient('honk_failed_' . $gateway, 1, DAY_IN_SECONDS);
    honk_send([
        'title' => sprintf('Payment failed: order #%s', $order->get_order_number()),
        'message' => sprintf('%s, %s %s via %s', $order->get_formatted_billing_full_name(), $order->get_total(), $order->get_currency(), $order->get_payment_method_title()),
        'severity' => 'long',
        'event_type' => 'problem',
        'category' => 'payments',
        'source' => 'woocommerce',
        'group_key' => 'payments/' . $gateway,
        'url' => $order->get_edit_order_url(),
    ], 'wc-' . $order->get_id() . '-failed');
}, 10, 2);

Honk is invite-only for now: request access. Everything in this guide works on the Free plan.