Services
Key service classes in the companion app.
ShopifyClient
App\Services\ShopifyClient
The central service for communicating with Shopify's Admin API. Supports both GraphQL and REST.
GraphQL
$client = app(ShopifyClient::class);
$response = $client->graphql('
query {
products(first: 10) {
edges {
node {
id
title
}
}
}
}
');GraphQL requests include automatic throttle detection and retry — when Shopify returns a throttled response, the client waits and retries.
REST
$response = $client->rest('GET', '/admin/api/2025-04/products.json');Authentication
Authentication is handled by ShopifyTokenManager, which:
- Uses the client credentials grant to exchange the client ID and secret for an access token
- Caches the encrypted token in Redis
- Auto-refreshes when the token expires (typically every 24 hours)
ShopifyInventoryService
App\Services\ShopifyInventoryService
Cache-aside inventory service that:
- Checks Redis for cached stock data
- On miss, queries the Admin API for inventory levels per location
- Caches the result with a configurable TTL
- Invalidates cache when inventory webhooks arrive
BundleService
App\Services\BundleService
Handles bundle resolution and cart operations:
- Finding bundles for a product or set of products
- Resolving slot products and available variants
- Processing add-to-cart requests for bundles
BundlePricingService
App\Services\BundlePricingService
Calculates bundle prices based on the configured pricing type:
- Percentage — applies a percentage discount to the bundle total
- Fixed Amount — subtracts a fixed amount from the bundle total
- Fixed Total — the bundle sells at a specific price regardless of item prices
BundleDiscountService
App\Services\BundleDiscountService
Manages Shopify discounts for bundles via the Admin API (GraphQL):
- Creates automatic discounts (preferred) or falls back to discount codes
- Monitors discount health and status
- Cleans up orphaned or expired discounts
ShopifyShippingService
App\Services\ShopifyShippingService
Fetches shipping profile data from Shopify to determine free shipping thresholds.
ShopifyCustomerService
App\Services\ShopifyCustomerService
Customer-related Shopify API operations.
NominatimGeocodingService
App\Services\NominatimGeocodingService
Geocodes store addresses using the Nominatim API (OpenStreetMap). Used by the GeocodeStore job when stores are created or updated in Filament.
Klaviyo Integration
App\Integrations\Klaviyo\
Optional Klaviyo integration that syncs wishlist and OOS events:
KlaviyoClient— API client for Klaviyo- Event listeners for wishlist and OOS events
- Jobs for async Klaviyo sync