Overview
Dualhook uses one connection-routing state for billing entitlement, plan limits, administrator holds, Meta enforcement, and terminal cleanup.
Only active connections and connections in plan-limit grace can use the outbound runtime. A blocked connection still consumes a plan slot but cannot route API requests. A terminating connection no longer consumes a slot.
Reversible billing and plan-limit blocks are connection pauses, not destructive disconnects.
Subscription Status
Dualhook keeps connections usable while a subscription is:
- active
- trialing
- past due while Stripe is still retrying payment
- scheduled to cancel at the end of its current billing period
Dualhook blocks routing when Stripe reports a non-entitled status such as unpaid, paused, or incomplete and expired. A failed invoice does not start the five-day plan-limit grace period: Stripe's own retry and dunning period applies instead.
Local outbound access is blocked first. Dualhook then attempts to clear the WABA-level Webhook Override without delaying the local block. If another current connection shares that WABA, Dualhook leaves the WABA callback active because clearing it would also interrupt the sibling connection. The blocked connection still cannot use Dualhook's outbound API.
Plan-Limit Grace
If a downgrade or other plan change leaves more connections than the plan permits, the deterministic over-limit connections receive five days of grace. They remain usable during that grace period.
After grace expires, those connections become blocked. Upgrading or freeing enough slots releases only the plan-limit hold; unrelated administrator, billing, or Meta holds remain in effect.
What Is Preserved
Pausing a connection does not wipe its setup.
Dualhook keeps:
- Connection name and organization link
- WABA ID and phone number ID
- Webhook URL and verify token
- Access token and related configuration
- Existing
dh_live_...runtime keys
That means you do not need to redo Embedded Signup just because billing paused a connection.
How Reactivation Works
When you subscribe again or move back to a plan with enough capacity, Dualhook attempts to restore the paused connection automatically.
If reactivation succeeds:
- The stored WABA-level Meta webhook override is restored and read back for verification.
- The relevant billing or plan-limit hold is released.
- The existing runtime key becomes usable again.
- Unrelated holds remain in effect.
Dualhook keeps the connection blocked if Meta rejects restoration or verification. Payment recovery alone does not claim that inbound routing is healthy.
Final Cancellation
Scheduling a cancellation does not immediately remove connections. They remain usable through the paid period.
When Stripe sends its final subscription-deleted event, Dualhook starts terminal cleanup. It immediately denies local access and revokes runtime keys, clears the connection's remote override where possible, conditionally unsubscribes the app only when no sibling connection still needs the WABA, erases stored credentials, and removes the connection row. Retryable cleanup progress remains in a credential-free audit record.
Because Meta does not provide a partner-side API to sever every Embedded Signup relationship, customers are also instructed to remove Dualhook under Meta Business Settings → Integrations → Connected apps.