Skip to main content

Webhook events

At the moment there are four important events to keep in sync with Pio, mainly these notification are related to inventory and fullfillment creation/update.

  • inventory_log.create: whenever there is a new entry in product_inventory_log in Pio and you have registered and subscribed to this hook then you'll receive POST call to target_url of the registered hook. The payload can be found here.

  • inventory_levels.update: whenever there is update to product stock count in Pio and you have registered and subscribed to this hook then you'll receive POST call to target_url of the registered hook. The payload can be found here.

info

You can also fetch latest inventory details about the product after directly using GET /products/:product_id

  • fulfillments.create: if you are subscribed to this event and fulfillment has been created for an order, you will get POST call to target_url of the registered hook with fulfillment payload defined here.

  • fulfillments.update: when order is being fulfilled it runs through several different states, if you are subscribed to this event and fulfillment has been updated for an order, you will get POST call to target_url of the registered hook with fulfillment payload defined here.

  • receivables.update: DEPRECATED Example here.

  • receivables.status_change: DEPRECATED Example here.

  • purchase_orders.update: Sent when there is an update to a purchase order. Typically this will be when products are matched to a purchase order during storing. This will inform that some of the items in the purchase order have been received. Example here.

  • purchase_orders.sync: Received when the user requests a purchase order sync. Useful if you have no automatic mechanism to sync purchase orders with pio but would like the user to be able to fetch changes when they know some are missing from pio. Example here.

  • external_transfers.create: When either side (or both sides) of the transfer is an external location, then the product_inventory_log entry with cause = EXTERNAL_TRANSFER is created, and an external_transfers.create is sent only to the integration which owns the external location. If both sides of the transfer are an external location, then 2 log entries will be created (one for each location) and an external_transfers.create webhook is sent for each log entry, but again, only to the integration which owns each external location. i.e. if the source and target external locations are for different integrations, each integration will receive only one external_transfers.create webhook, but if the transfer's source and target external locations belong to the same integration, it will receive two ``external_transfers.create` webhooks (one for each location). Example here.