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
- Investigate and repair the orphaned ProviderOrganization row (remove it or restore the Organization).
- Add a cleanup step that prunes ProviderOrganizations whose OrganizationId no longer resolves.
- 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
- Run referential-integrity checks before bulk plan changes.
- Clean up orphaned ProviderOrganization rows when orgs are deleted.
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
- Failed to remove organization vault. Please contact support.
- Organization already belongs to a provider.
- Organization must have at least one confirmed owner.
- The organization is subscribed to Secrets Manager. Please co
- Provider name not found.
AI-assisted analysis of bitwarden/server@e93b962371 (2026-08-13).
Data as JSON: /api/errors/99fe8408e10ae06e.
Report an issue: GitHub.