bitwarden/server · error · ConflictException

Organization '{providerOrganization.Id}' not found.

Error message

Organization '{providerOrganization.Id}' not found.

What it means

Thrown by ProviderBillingService.ChangePlan while propagating a new plan type to a provider's client organizations: for a providerOrganization detail row, the underlying Organization (organizationRepository.GetByIdAsync) returns null. The ProviderOrganization exists but the Organization it references does not. ConflictException (HTTP 409) reflecting a referential-integrity conflict.

Source

Thrown at bitwarden_license/src/Commercial.Core/Billing/Providers/Services/ProviderBillingService.cs:217

            ]
        };

        await stripeAdapter.UpdateSubscriptionAsync(provider.GatewaySubscriptionId, updateOptions);

        // Refactor later to ?ChangeClientPlanCommand? (ProviderPlanId, ProviderId, OrganizationId)
        // 1. Retrieve PlanType and PlanName for ProviderPlan
        // 2. Assign PlanType & PlanName to Organization
        var providerOrganizations =
            await providerOrganizationRepository.GetManyDetailsByProviderAsync(providerPlan.ProviderId);

        var newPlan = await pricingClient.GetPlanOrThrow(newPlanType);

        foreach (var providerOrganization in providerOrganizations)
        {
            var organization = await organizationRepository.GetByIdAsync(providerOrganization.OrganizationId);
            if (organization == null)
            {
                throw new ConflictException($"Organization '{providerOrganization.Id}' not found.");
            }

            organization.PlanType = newPlanType;
            organization.Plan = newPlan.Name;
            await organizationRepository.ReplaceAsync(organization);
        }
    }

    public async Task CreateCustomerForClientOrganization(
        Provider provider,
        Organization organization)
    {
        ArgumentNullException.ThrowIfNull(provider);
        ArgumentNullException.ThrowIfNull(organization);

        if (!string.IsNullOrEmpty(organization.GatewayCustomerId))
        {
            logger.LogWarning("Client organization ({ID}) already has a populated {FieldName}", organization.Id,

View on GitHub (pinned to e93b962371)

Solutions

  1. Investigate and repair the orphaned ProviderOrganization row (remove it or restore the Organization).
  2. Add a cleanup step that prunes ProviderOrganizations whose OrganizationId no longer resolves.
  3. Run a referential-integrity check across ProviderOrganization -> Organization before bulk plan changes.

Example fix

// before
await providerBillingService.ChangePlan(command); // throws if any org is missing

// after — pre-clean orphaned provider organizations
var details = await providerOrganizationRepository.GetManyDetailsByProviderAsync(providerPlan.ProviderId);
foreach (var d in details)
    if (await organizationRepository.GetByIdAsync(d.OrganizationId) == null)
        await providerOrganizationRepository.DeleteAsync(d); // remove orphan
await providerBillingService.ChangePlan(command);
Defensive patterns

Strategy: validation

Validate before calling

foreach (var d in details) if (await organizationRepository.GetByIdAsync(d.OrganizationId) == null) return Conflict($"Org {d.Id} missing.");

Try / catch

try { await providerBillingService.ChangePlan(command); }
catch (ConflictException ex) when (ex.Message.Contains("not found")) { /* prune orphan ProviderOrganization, retry */ }

Prevention

When it happens

Trigger: A ProviderOrganization row points at an OrganizationId whose Organization row was deleted or never inserted; orphaned provider-org linkage after a failed org deletion.

Common situations: Data-integrity issue: an organization was hard-deleted without removing its ProviderOrganization; a partially-failed migration; manual DB edits.

Related errors


AI-assisted analysis of bitwarden/server@e93b962371 (2026-08-13). Data as JSON: /api/errors/99fe8408e10ae06e. Report an issue: GitHub.