Documentation Index
Fetch the complete documentation index at: https://docs.digifist.com/llms.txt
Use this file to discover all available pages before exploring further.
Galantis registers webhooks across every major Shopify data domain at installation time. These webhooks are the primary mechanism for keeping Galantis data current — when something changes in Shopify, the corresponding webhook fires and Galantis processes the update through a dedicated handler job queued via Redis and Laravel Horizon.
Understanding the webhook architecture is useful for debugging data synchronization issues, understanding trigger timing, and tracing the path of a specific event from Shopify through to Galantis behavior.
What this covers
- Every registered webhook topic and its handler job
- What each webhook powers in Galantis
- How webhooks are processed through the queue layer
- Security validation and retry behavior
- What happens when a webhook is missed
How webhook processing works
When Shopify sends a webhook to Galantis:
- Galantis receives the webhook at a registered endpoint
- The payload is validated via signature verification before processing — invalid signatures are rejected
- A handler job is dispatched to the Redis queue via Laravel Horizon
- The job processes the payload asynchronously — updating records, triggering domain events, and dispatching downstream actions
- If the job fails, Laravel’s queue retry mechanism re-attempts it with exponential backoff
This queue-based processing means webhook handling is resilient to temporary failures — a transient database issue or downstream API error does not cause the webhook to be permanently lost. Failed jobs are retried automatically until they succeed or exhaust the retry limit.
Customer webhooks
| Topic | Handler Job | What it does in Galantis |
|---|
customers/create | ProcessShopifyCustomerCreatedJob | Creates a new contact record; fires CustomerCreated domain event; may enroll customer in CUSTOMER_CREATED automation |
customers/update | ProcessShopifyCustomerUpdatedJob | Updates profile fields — name, phone, email, locale, tags; fires CustomerUpdated domain event |
customers/delete | ProcessShopifyCustomerDeletedJob | Removes the contact record; fires CustomerDeleted domain event |
customers/marketing_consent_updated | ProcessShopifyCustomerMarketingConsentUpdatedJob | Updates marketing_state on the contact record; fires CustomerMarketingConsentUpdated domain event |
customer_tags/added | ProcessShopifyCustomerTagsAddedJob | Adds tags to the contact record; fires CustomerTagsAdded domain event; may fire CUSTOMER_TAGGED automation trigger |
customer_tags/removed | ProcessShopifyCustomerTagsRemovedJob | Removes tags from the contact record; fires CustomerTagsRemoved domain event |
Order webhooks
| Topic | Handler Job | What it does in Galantis |
|---|
orders/create | ProcessShopifyOrderCreatedJob | Creates an order record; fires OrderCreated domain event; enrolls qualifying customers in ORDER_PLACED automation |
orders/cancelled | ProcessShopifyOrderCancelledJob | Updates order status; fires OrderCancelled domain event; enrolls qualifying customers in ORDER_CANCELLED automation |
orders/updated | ProcessShopifyOrderShippedJob | Detects fulfillment data in the update payload; fires OrderShipped domain event when fulfillment present; enrolls qualifying customers in ORDER_SHIPPED automation |
The orders/updated webhook covers all order update events in Shopify, not only shipping. ProcessShopifyOrderShippedJob specifically detects whether the update contains fulfillment data and only fires the OrderShipped domain event when it does — other order update types are handled or ignored based on their content.
Product and collection webhooks
| Topic | Handler Job | What it does in Galantis |
|---|
products/create | ProcessShopifyProductCreatedJob | Creates a product record in Galantis; queues for Meta catalog push |
products/update | ProcessShopifyProductUpdatedJob | Updates product fields, variant data, pricing, and inventory; detects inventory_quantity 0→>0 for Back-in-Stock trigger; queues updated product for Meta catalog sync |
products/delete | ProcessShopifyProductDeletedJob | Removes the product record; removes from Meta catalog |
collections/create | ProcessShopifyCollectionCreatedJob | Creates a collection record in Galantis |
collections/update | ProcessShopifyCollectionUpdatedJob | Updates collection data and product memberships |
collections/delete | ProcessShopifyCollectionDeletedJob | Removes the collection record |
Billing and app lifecycle webhooks
| Topic | Handler Job | What it does in Galantis |
|---|
app_subscriptions/update | MonitorBillingSubscriptionsJob | Processes plan changes, upgrades, downgrades, and subscription status updates from Shopify Billing |
app/uninstalled | Tenant deactivation | Deactivates the Galantis tenant workspace; stops all automation processing and message sending for the store |
The app/uninstalled webhook triggers immediate tenant deactivation. If the app is reinstalled, a new OAuth token exchange occurs and data may need to be re-synced depending on how long the app was uninstalled. Active automations and campaign schedules from before uninstallation are not automatically re-activated.
GDPR compliance webhooks
| Topic | Handler Job | What it does in Galantis |
|---|
customers/redact | ProcessShopifyCustomersRedactJob | Sets the affected customer’s marketing_state to REDACTED; initiates data erasure for the customer record |
shop/redact | ProcessShopifyShopRedactJob | Initiates full shop-level data erasure for uninstalled stores that have requested data deletion |
These webhooks are sent by Shopify in response to GDPR data subject requests and merchant data deletion requests. See Compliance — GDPR & Data Privacy for the full context.
Domain events
Every handler job fires one or more internal domain events after processing the webhook payload. These events are what automation triggers and other platform listeners subscribe to:
| Domain event | Fired by | Powers |
|---|
CustomerCreated | ProcessShopifyCustomerCreatedJob | CUSTOMER_CREATED automation trigger |
CustomerUpdated | ProcessShopifyCustomerUpdatedJob | Segment re-evaluation |
CustomerTagsAdded | ProcessShopifyCustomerTagsAddedJob | CUSTOMER_TAGGED automation trigger |
OrderCreated | ProcessShopifyOrderCreatedJob | ORDER_PLACED automation trigger |
OrderCancelled | ProcessShopifyOrderCancelledJob | ORDER_CANCELLED automation trigger |
OrderShipped | ProcessShopifyOrderShippedJob | ORDER_SHIPPED automation trigger |
CustomerMarketingConsentUpdated | ProcessShopifyCustomerMarketingConsentUpdatedJob | marketing_state update on contact profile |
What happens when a webhook is missed
Webhook delivery is not guaranteed — Shopify will retry failed deliveries, but a sustained Galantis outage or network issue can result in missed webhooks. When this happens, the Galantis record for affected entities will be stale until a corrective sync occurs.
Recovery options:
- For product data — trigger a manual full sync from Catalog → Shopify Sync → Sync Now
- For abandoned checkouts — the polling mechanism runs every 10 minutes and self-heals; no manual recovery is needed