phacility/phabricator · error · PhabricatorWorkerPermanentFailureException

Unable to load any of the members of the account ("%s") for

Error message

Unable to load any of the members of the account ("%s") for this subscription ("%s").

What it means

Phortune (Phabricator's billing application) renews subscriptions from the queue: PhortuneSubscriptionWorker wakes on each billing trigger and must create the renewal cart on behalf of some member of the payment account (the actor). This error means membership records exist, but none of those member users could actually be loaded, so no actor is available for $account->newCart($actor, ...). It is thrown as PhabricatorWorkerPermanentFailureException, so the task fails permanently and will not be retried.

Source

Thrown at src/applications/phortune/worker/PhortuneSubscriptionWorker.php:89

        $message = pht(
          'All members of the account ("%s") for this subscription ("%s") '.
          'are disabled.',
          $account->getPHID(),
          $subscription->getPHID());
      } else if ($account->getMemberPHIDs()) {
        $message = pht(
          'Unable to load any of the members of the account ("%s") for this '.
          'subscription ("%s").',
          $account->getPHID(),
          $subscription->getPHID());
      } else {
        $message = pht(
          'The account ("%s") for this subscription ("%s") has no '.
          'members.',
          $account->getPHID(),
          $subscription->getPHID());
      }
      throw new PhabricatorWorkerPermanentFailureException($message);
    }

    $cart = $account->newCart($actor, $cart_implementation, $merchant);

    $purchase = $cart->newPurchase($actor, $product);

    $purchase
      ->setBasePriceAsCurrency($currency)
      ->setMetadataValue('subscriptionPHID', $subscription->getPHID())
      ->setMetadataValue('epoch.start', $last_epoch)
      ->setMetadataValue('epoch.end', $next_epoch)
      ->save();

    $cart
      ->setSubscriptionPHID($subscription->getPHID())
      ->setIsInvoice(1)
      ->save();

View on GitHub (pinned to 5720a38cfe)

Solutions

  1. Add an active administrator as a member of the Phortune account (Phortune account Members UI) so the next trigger has a valid actor
  2. If the subscription is obsolete, delete or cancel it so its trigger stops queueing permanent failures
  3. Open the daemon task console (Daemons, failed/archived tasks) and inspect the permanent failure to confirm the account and subscription PHIDs involved
  4. Verify the member users still exist and are not disabled before the next billing epoch
Defensive patterns

Strategy: validation

Validate before calling

// Before enabling automatic renewals, make sure the Phortune account
// has at least one member who can act as the billing actor.
$account = id(new PhortuneAccountQuery())
  ->setViewer(PhabricatorUser::getOmnipotentUser())
  ->withPHIDs(array($account_phid))
  ->executeOne();
if (!$account || !$account->getMemberPHIDs()) {
  throw new Exception(pht('Add a member to the account before subscribing.'));
}

Try / catch

try {
  // custom code that re-fires PhortuneSubscriptionWorker tasks manually
} catch (PhabricatorWorkerPermanentFailureException $ex) {
  // Terminal: alert operations; fix account membership before the next epoch.
}

Prevention

When it happens

Trigger: A subscription trigger fires; the worker loads the account's member PHIDs, but every member user fails to load afterwards (all were deleted or disabled), so the actor selection loop ends empty and the permanent failure is raised before cart creation.

Common situations: All members of a Phortune account were deleted after the subscription was configured (typical when cleaning up test accounts while test subscriptions still fire); user records removed by a migration while phortune account membership data survived in a partially inconsistent state.

Related errors


AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21). Data as JSON: /api/errors/17376185e7d9a1f3. Report an issue: GitHub.