Skip to content
This guide is designed specifically for developers.

Webhooks

Globe can send HTTP POST notifications to your server when key events occur in your store. Use webhooks to build custom automations — update your WMS, trigger fulfilment workflows, send notifications, or sync data with external systems.


  1. Go to Settings → Webhooks in the Globe admin.
  2. Click Add webhook, enter an HTTPS endpoint URL, and choose the events you want to receive.
  3. Copy the secret shown after creation — it is displayed only once. Store it securely.

Subscriptions receive the label PDF in shipping_label.created events by default. The PDF contains the customer’s name, address and phone number. If your integration does not need it, turn off Include label PDF in the subscription settings: events then carry only the documentUrl, which you open with a Globe API key (Settings → API).


Every webhook is a POST request with Content-Type: application/json. The body always follows this structure:

{
"event": "shipping_label.created",
"eventId": "evt_9wB3kLm2pQx7",
"shopName": "your-store.myshopify.com",
"sentAt": "2026-01-15T10:30:00.000Z",
"deliveryId": "b3d1e4f2-9c2a-4f1b-8e3d-1a2b3c4d5e6f",
"data": { ... }
}
FieldDescription
eventEvent type (see below)
eventIdUnique ID of the event (evt_…) — the same across all subscriptions, retries and resends of this event. Use it for deduplication
shopNameYour Shopify store domain
sentAtISO 8601 timestamp of when Globe sent the request
deliveryIdUnique UUID for this delivery attempt — every retry and resend gets a new one, so it cannot be used for deduplication
dataEvent-specific payload (see events below)

Fired when a shipping label is successfully generated for an order.

Key fields in data:

FieldDescription
labelIdLabel ID (lbl_…) — the same ID the Globe API returns
orderIdShopify order GID
orderNameOrder name, e.g. #1001
fulfillmentOrderIdsFulfillment order GIDs this label covers
directionoutbound or return
supersedesLabelIdsIDs of older labels this label replaces. The replaced label may still be a valid, paid shipment at the carrier
carrierCarrier code, e.g. packeta
carrierAccountIdID of the carrier account used, as a raw hex ID. The Globe API ID is ca_ followed by this value
internalBatchIdGlobe’s internal batch ID
trackingNumberTracking number
trackingUrlTracking page URL
documentUrlURL of the label PDF in the Globe API (https://api-globe.appfleece.app/v1/labels/{id}/document). Requires a Globe API key — without one it returns 401, which is intentional
labelDataBase64-encoded PDF, or null — see the note below
additionalDataCarrier-specific extras (see below)
createdAtISO 8601 timestamp of when the label was created

additionalData carries values that only one carrier can produce, so the rest of the payload keeps the same shape for every carrier. Packeta sends consignPassword — the 9-digit consign code that opens a Z-BOX when you drop the parcel in. It is filled in when the carrier account has Show consign code (Z-BOX) enabled, and null otherwise. Carriers with no extras of their own send an empty object.

Labels created through the Globe API carry five more fields:

FieldDescription
labelCreationIdThe label creation (lcr_…) that created the label
sourceapi
clientReferenceThe client_reference of the request, or null
cod{amount, currency, source}: what the courier collects
labelFormatlabel. For these labels labelData is the stored PDF in the label-printer format, not the account’s print format

Fired when a label creation from POST /v1/labels changes:

  • it leaves processing and becomes succeeded, failed or needs_attention;
  • a creation in needs_attention gets its label after all, is resolved, fails because PPL refused the shipment at import, or becomes abandoned after 24 hours;
  • the fulfillment and order tags of a succeeded creation finish;
  • the PDF of a succeeded creation is stored after a delay (Packeta through an external carrier).

A POST /v1/labels refused after its creation record exists (the error carries details.label_creation_id) fires it with status: failed. A refusal before that, such as a validation error, a missing scope, a rate limit or idempotency_conflict, fires nothing. Dry runs never fire it.

Key fields in data:

FieldDescription
labelCreationIdThe label creation (lcr_…)
statussucceeded, failed, needs_attention or abandoned
previousStatusThe status before this change. Equal to status when only the side effects or the PDF changed
nextActionThe creation’s next_action, the same value the API returns. For succeeded it is fetch_document, wait_for_document or none
labelIdsThe labels (lbl_…) of the creation
orderIdShopify order GID
errorCodeFor failed, the error code, e.g. carrier_rejected or resolved_not_created. Otherwise null
sideEffects{fulfillment: {mode, status, reason}, orderTags: {status}}, or null. The same values as side_effects in the API
clientReferenceThe client_reference of the request, or null

The payload never contains the label PDF or text from the carrier. Include label PDF does not apply to this topic. Read the full state with GET /v1/label-creations/{id}.

Each change is a new event with its own eventId. Retries, resends from the delivery log, and a re-publish after Globe failed to queue the event all carry the same eventId, so deduplicate on it.


Fired when a pickup point is selected or changed on an order.

Key fields in data: orderId, orderName, pickupPoint

The pickupPoint field contains the full pickup point object including name, address, GPS coordinates, and carrier-specific data.


Fired approximately 5 minutes after order creation when the order requires a pickup point but none has been selected yet.

Key fields in data: orderId, orderName, customerEmail


Fired when the carrier confirms that a cash-on-delivery order has been paid.

Key fields in data: orderId, orderName, carrier


Fired when the carrier reports a change in delivery status.

Key fields in data: orderId, orderName, carrier, status, previousStatus


Fired when Globe sends a pickup-point selection reminder email to the customer.

Key fields in data: orderId, orderName, customerEmail, reminderType


To explore the exact payload structure for each event, you can point a subscription at a request inspector such as webhook.site:

  1. Open webhook.site and copy your unique URL.
  2. Add it as a webhook endpoint in Globe (Settings → Webhooks) with Include label PDF turned off.
  3. Trigger the event using a test order — place a test order, export its label, etc.
  4. The full request body will appear on webhook.site in real time.

Each request includes the following headers:

HeaderDescription
X-Globe-Signature-V2t=<unix>,v1=<hex> — HMAC-SHA256 over t + "." + <raw body>, signed with your secret. The timestamp is inside the signature
X-Globe-Signaturesha256=<hmac> — legacy HMAC-SHA256 of the raw request body (kept for compatibility)
X-Globe-EventEvent type
X-Globe-Event-IdEvent ID (evt_…) — same value as eventId in the body
X-Globe-DeliveryDelivery UUID
X-Globe-TimestampUnix timestamp in seconds (legacy, unsigned — prefer the signed t in X-Globe-Signature-V2)

Verify with the v2 signature. The v1 signature covers only the body, so the legacy X-Globe-Timestamp header next to it is unsigned — an attacker replaying a captured request could rewrite it. In v2 the timestamp is part of the signed string, so checking t actually protects you:

Node.js verification example:

import crypto from "crypto";
function verifyGlobeWebhook(rawBody, headers, secret) {
const header = headers["x-globe-signature-v2"] ?? "";
const match = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(header);
if (!match) return false;
const [, t, v1] = match;
// Reject stale requests (replay attack prevention) — t is signed
if (Math.abs(Math.floor(Date.now() / 1000) - Number(t)) > 300) return false;
const expected = crypto
.createHmac("sha256", secret)
.update(`${t}.${rawBody}`)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(v1),
Buffer.from(expected)
);
}

Globe retries failed deliveries up to 7 times with exponential backoff:

30 s → 5 min → 30 min → 2 h → 8 h → 24 h → dead letter

Your endpoint must return a 2xx status within 10 seconds. After that the request is treated as failed.

If an endpoint fails repeatedly, Globe temporarily suspends deliveries for 24 hours and retries automatically. After 3 suspension cycles with no successful delivery the subscription is disabled. You can re-enable it at any time from Settings → Webhooks.