Skip to content

Configuration reference

Full reference for config/integrations.php. Publish with:

bash
php artisan vendor:publish --tag=integrations-config

General

KeyTypeDefaultDescription
table_prefixstring'integration'Prefix for all database tables
cache_prefixstring'integrations'Prefix for all cache keys

Webhook

KeyTypeDefaultDescription
webhook.prefixstring'integrations'URL prefix: POST /{prefix}/{provider}/webhook
webhook.queuestring'default'Queue for ProcessWebhook jobs
webhook.max_payload_bytesint1048576Reject payloads larger than this (1MB)
webhook.processing_timeoutint1800Seconds before a processing webhook is stale (30 min)
webhook.middlewarearray[]Additional middleware for webhook routes

OAuth

KeyTypeDefaultDescription
oauth.route_prefixstring'integrations'URL prefix for OAuth routes
oauth.middlewarearray['web']Middleware for authorize + revoke routes
oauth.callback_middlewarearray['web']Middleware for callback route
oauth.success_redirectstring'/integrations'Redirect after OAuth completes
oauth.state_ttlint600State token validity in seconds (10 min)
oauth.refresh_lock_ttlint30Cache lock TTL for token refresh
oauth.refresh_lock_waitint15Max wait for refresh lock in seconds

Mappings

KeyTypeDefaultDescription
mappings.lock_ttlint10Cache lock TTL in seconds while upsertByExternalId() creates a model and claims its external ID
mappings.lock_waitint10Max wait for that lock in seconds
mappings.collation?stringnullCollation for the mapping table's string columns. Applied on MySQL and MariaDB, ignored on every other driver; null inherits the connection default. Set it to match your own tables when comparing internal_id against your primary keys fails with Illegal mix of collations.

The lock only serialises across processes on a shared cache driver. See ID mapping.

Sync

KeyTypeDefaultDescription
sync.queuestring'default'Default queue for the SyncIntegration job
sync.queuesarray[]Per-provider queue overrides (key = provider, value = queue)
sync.lock_ttlint1800WithoutOverlapping lock TTL in seconds (must be ≥ job_timeout)
sync.job_timeoutint1800SyncIntegration job timeout in seconds (30 min). integrations:sync reads this on dispatch; direct callers can override via the constructor.
sync.item_queue?stringnullQueue for the per-item ProcessSyncItem jobs. null = same as sync.queue.
sync.item_triesint5Genuine listener exceptions before an item is marked failed and lands in failed_jobs. Transient rate-limit deferrals are not counted.
sync.item_backoffarray[10, 30, 120, 300, 900]Seconds between item retries
sync.item_retry_windowint21600Absolute seconds an item may keep retrying, including rate-limit deferrals (6h)
sync.max_items_per_batchint10000Soft cap; a run with more items still processes as one batch but logs a warning
sync.item_reclaim_afterint43200Seconds an item may sit in flight before it is presumed abandoned (12h). The row is then marked failed so its run can finalise. Never applied below item_retry_window plus an hour: a rate-limited item stays in flight that long by design.
sync.failure_backoff_max_multiplierint16Ceiling on the interval multiplier applied to next_sync_at while runs keep failing
sync.stuck_item_after_runsint5Consecutive failed runs for one external ID before SyncItemStuck fires
sync.stale_after_intervalsint10Missed sync intervals before an integration counts as stale. Measured against the configured interval, not the backed-off one.

Retry

KeyTypeDefaultDescription
retry.retry_after_max_secondsint600Cap Retry-After header values (10 min)

Rate Limiting

KeyTypeDefaultDescription
rate_limiting.max_wait_secondsint10Max seconds to sleep waiting for capacity before throwing (0 = immediate). Applies independently to the suppression gate and the window bucket.
rate_limiting.overrides_enabledbooltrueHonour per-integration rate-limit overrides. false ignores the override columns and falls back to the provider's defaultRateLimit().

Circuit breaker

See Circuit breaker for the full state machine, strategies, and runtime overrides.

KeyTypeDefaultDescription
circuit_breaker.enabledbooltrueMaster switch. false disables breaker entirely.
circuit_breaker.strategystring'rate''rate' (failure % over a window) or 'count' (consecutive failures).
circuit_breaker.time_windowint60Rate strategy: rolling failure window in seconds.
circuit_breaker.failure_rate_thresholdint50Rate strategy: failure percentage (1-100) that opens the breaker.
circuit_breaker.minimum_requestsint10Rate strategy: requests in the window before it can trip.
circuit_breaker.thresholdint5Count strategy: consecutive upstream failures before the breaker opens.
circuit_breaker.cooldown_secondsint60Seconds to stay open before allowing a half-open probe.
circuit_breaker.overrides_enabledbooltrueHonour per-integration circuit overrides. false ignores the override columns.

Observability

Failure-anomaly evaluation and the incident audit. See the anomaly signal and incident history.

KeyTypeDefaultDescription
observability.anomaly_enabledbooltrueMaster switch for integrations:evaluate-failures. false makes it a no-op.
observability.anomaly_window_minutesint15Rolling window the failure rate is measured over.
observability.anomaly_failure_rate_thresholdint25Failure percentage (1-100) at or above which an anomaly fires.
observability.anomaly_minimum_requestsint20Requests in the window before the rate can fire.
observability.incidents_enabledbooltrueMaster switch for the durable incident audit (integration_incidents).

Health

KeyTypeDefaultDescription
health.degraded_afterint5Consecutive failures before degraded
health.failing_afterint20Consecutive failures before failing
health.disabled_after?int50Consecutive failures before disabled (null = never)
health.degraded_backoffint2Sync interval multiplier when degraded
health.failing_backoffint10Sync interval multiplier when failing

Logging

KeyTypeDefaultDescription
logging.max_response_bytes?intnullCap on a stored response body (null = store whole; values under 1024 are ignored)

Cached and idempotent-write responses are stored whole regardless, since the package reads those back. See Request logging.

Pruning

KeyTypeDefaultDescription
pruning.requests_daysint90Retention for integration_requests
pruning.logs_daysint365Retention for integration_logs
pruning.idempotency_keys_daysint90Retention for integration_idempotency_keys. Set comfortably longer than your longest queue retry window.
pruning.sync_items_daysint30Retention for completed (success / skipped) integration_sync_items. failed rows are kept until resolved.
pruning.incidents_daysint365Retention for closed integration_incidents (by closed_at). Open incidents are never pruned.
pruning.incidents_stale_after_daysint7Auto-close incidents left open longer than this for a currently-healthy integration.
pruning.chunk_sizeint1000Rows per delete batch

Providers

php
'providers' => [
    'zendesk' => App\Integrations\ZendeskProvider::class,
    'github'  => App\Integrations\GitHubProvider::class,
],

Keys are provider identifiers (stored in the Integration model's provider column). Values are fully-qualified class names implementing IntegrationProvider. Can also be registered programmatically via Integrations::register().