@prefix : <https://ontology.inferal.com/profiles/relay-advertising/microsoftads/> .
@prefix aent: <https://ontology.inferal.com/modules/advertising-entity/> .
@prefix adm: <https://ontology.inferal.com/modules/advertising-measurement/> .
@prefix abg: <https://ontology.inferal.com/modules/advertising-budget/> .
@prefix adel: <https://ontology.inferal.com/modules/advertising-delivery-state/> .
@prefix ord: <https://ontology.inferal.com/modules/ordering/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix mod: <https://w3id.org/mod#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix prof: <http://www.w3.org/ns/dx/prof/> .
@prefix pubacc: <https://ontology.inferal.com/modules/publication-access/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix vann: <http://purl.org/vocab/vann/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

: a owl:Ontology, prof:Profile, pubacc:PublicationManagedOntology ;
    dcterms:accessRights pubacc:PublicAccess ;
    owl:imports aent:, adm:, abg:, adel:, ord: ;
    prof:isProfileOf aent:, adm:, abg:, adel: ;
    dcterms:title "Relay Advertising Profile: Microsoft Advertising" ;
    dcterms:description "Context and metric qualifications for Microsoft campaign snapshots, conversion controls and normalized daily reports using shared advertising entities, measurements and budgets, and the links from Microsoft status values to shared hold kinds." ;
    dcterms:license <https://creativecommons.org/licenses/by/4.0/> ;
    dcterms:source <https://learn.microsoft.com/en-us/advertising/guides/reports?view=bingads-13> ;
    vann:preferredNamespacePrefix "ms-adv" ;
    vann:preferredNamespaceUri "https://ontology.inferal.com/profiles/relay-advertising/microsoftads/" ;
    mod:status "draft" ;
    owl:versionInfo "0.3.0" ;
    rdfs:comment "The context records are supplied by the mapping caller, not invented provider response fields. Synthetic contract evidence does not qualify a live connector. See the mapping LOSS.md for supported inputs and omitted meanings." .

:AccountSnapshot a rdfs:Class ;
    rdfs:label "account retrieval snapshot" ;
    rdfs:comment "Caller-supplied evidence that these campaign, budget, conversion goal and UET tag records were retrieved in exactly one account context at observedAt. Membership is asserted only at that instant, not throughout historical report windows." .

:account a rdf:Property ;
    rdfs:label "observation account" ;
    rdfs:comment "On AccountSnapshot, the native advertiser account record establishing retrieval context, exactly one per snapshot. On CampaignDeliveryObservation, the resolved shared account whose identity scopes that campaign evidence." .
:campaign a rdf:Property ;
    rdfs:label "observed campaign" ;
    rdfs:comment "On AccountSnapshot, a native campaign record explicitly retrieved under its account. On CampaignDeliveryObservation, the resolved shared campaign identified in that account context. Neither relationship is inferred from a name or report row." .
:adGroup a rdf:Property ;
    rdfs:label "retrieved ad group" ;
    rdfs:comment "A native ad group record retrieved under this snapshot's account. Its campaign is named by inCampaign on the record." .
:ad a rdf:Property ;
    rdfs:label "retrieved ad" ;
    rdfs:comment "A native ad record of any Microsoft ad type retrieved under this snapshot's account. Its ad group is named by inAdGroup on the record." .
:inCampaign a rdf:Property ;
    rdfs:label "in campaign" ;
    rdfs:comment "The campaign record an ad group was retrieved under, as the caller's request establishes it. Microsoft ad group records carry no campaign identifier." .
:inAdGroup a rdf:Property ;
    rdfs:label "in ad group" ;
    rdfs:comment "The ad group record an ad was retrieved under, as the caller's request establishes it. Microsoft ad records carry no ad group identifier." .
:budget a rdf:Property ;
    rdfs:label "retrieved budget" ;
    rdfs:comment "A native budget record retrieved under this snapshot's account, required to establish authoritative shared-budget amounts." .
:observedAt a rdf:Property ;
    rdfs:label "observed at" ;
    rdfs:comment "The time of retrieval evidence, with a timezone. It does not establish the start of a historical validity interval." ;
    rdfs:range xsd:dateTime .

:AdGroupRetrieval a rdfs:Class ;
    rdfs:label "native ad group retrieval" ;
    rdfs:comment "Caller-supplied linkage between an account snapshot, a native GetAdGroupsByCampaignId request and its response at one capture instant. The request establishes parenthood; names never do." ;
    dcterms:source <https://learn.microsoft.com/en-us/advertising/campaign-management-service/getadgroupsbycampaignid?view=bingads-13> .
:AdRetrieval a rdfs:Class ;
    rdfs:label "native ad retrieval" ;
    rdfs:comment "Caller-supplied linkage between a qualified ad group retrieval and the native GetAdsByAdGroupId request and response at the same instant. This records returned descendants, without proving complete account enumeration." ;
    dcterms:source <https://learn.microsoft.com/en-us/advertising/campaign-management-service/getadsbyadgroupid?view=bingads-13> .
:accountSnapshot a rdf:Property ;
    rdfs:label "account snapshot context" ;
    rdfs:comment "The account snapshot establishing account, campaign records and capture time for a native lower hierarchy retrieval." ;
    rdfs:range :AccountSnapshot .
:adGroupRetrieval a rdf:Property ;
    rdfs:label "ad group retrieval context" ;
    rdfs:comment "The parent retrieval response containing the requested ad group; the linked retrievals must share an observation instant." ;
    rdfs:range :AdGroupRetrieval .
:request a rdf:Property ;
    rdfs:label "native retrieval request" ;
    rdfs:comment "The exact native request paired with the retrieval response. Its CampaignId or AdGroupId establishes the reported parent in the explicit account context." .
:response a rdf:Property ;
    rdfs:label "native retrieval response" ;
    rdfs:comment "The native response paired with a request, retaining the explicitly returned records. An omitted child is not evidence of deletion." .
:RetrievedTargetingGroup a rdfs:Class ;
    rdfs:subClassOf aent:TargetingGroup ;
    rdfs:label "snapshot targeting group" ;
    rdfs:comment "A snapshot-qualified projection of a returned native ad group. The resource includes its capture instant; identifiedBy points to its stable account-scoped provider identity. This separation prevents a time-unaware hierarchy query from joining different parent contexts." .
:RetrievedAd a rdfs:Class ;
    rdfs:subClassOf aent:AdvertisingResource ;
    rdfs:label "snapshot retrieved ad" ;
    rdfs:comment "A snapshot-qualified returned native ad retaining identity and membership even when embedded creative content is unavailable. It additionally becomes a shared Ad only when a returned expanded-text composition can satisfy the shared creative requirement. No independent provider creative identifier is invented." .

:utcTimeOrdering a ord:Ordering ;
    rdfs:label "UTC instant ordering" ;
    rdfs:comment "Chronological ordering of the UTC instants used for point-in-time snapshots and daily report windows." .

:ReportDelivery a rdfs:Class ;
    rdfs:label "normalized report delivery" ;
    rdfs:comment "Caller-supplied delivery context for normalized daily rows. Complete means provider completeness evidence has been checked, not merely that the download finished. Every requested segmentation dimension must be declared as breakdown." .
:aggregation a rdf:Property ;
    rdfs:label "report aggregation" ;
    rdfs:comment "The requested aggregation, which this profile restricts to Daily with a TimePeriod column." ; rdfs:range xsd:string .
:reportTimeZone a rdf:Property ;
    rdfs:label "requested report timezone" ;
    rdfs:comment "The provider request timezone used to resolve relative dates. Downloaded report days are UTC regardless of this setting." ; rdfs:range xsd:string .
:complete a rdf:Property ;
    rdfs:label "complete report data" ;
    rdfs:comment "Caller attestation based on provider completeness metadata. False or absent excludes the delivery from business metric queries; true does not preclude later provider adjustments." ; rdfs:range xsd:boolean .
:row a rdf:Property ;
    rdfs:label "normalized report row" ;
    rdfs:comment "An explicitly typed Relay daily campaign report row belonging to this delivery." .
:downloadedAt a rdf:Property ;
    rdfs:label "downloaded at" ;
    rdfs:comment "Timestamp of a report revision. Observation identity includes this revision, so later adjustments cannot merge incompatible values. Consumer queries select the latest complete revision for each campaign, day and currency." ; rdfs:range xsd:dateTime .
:breakdown a rdf:Property ;
    rdfs:label "requested breakdown" ;
    rdfs:comment "A requested segmentation column, such as DeviceType. Any declared breakdown excludes the delivery from this unsegmented profile. Absence is an explicit caller assertion that there are no breakdowns." ; rdfs:range xsd:string .
:reportAccount a rdf:Property ;
    rdfs:label "report account" ;
    rdfs:comment "Shared account identified by a report row. This does not assert a historical hierarchy membership." ; rdfs:range aent:AdAccount .
:reportDate a rdf:Property ;
    rdfs:label "UTC report date" ;
    rdfs:comment "The UTC day of a normalized daily observation, retained alongside its shared reporting window." ; rdfs:range xsd:date .
:budgetAccount a rdf:Property ;
    rdfs:label "budget account" ;
    rdfs:comment "The shared account whose explicit retrieval context establishes the budget identity and currency." ; rdfs:range aent:AdAccount .
:providerBudgetId a rdf:Property ;
    rdfs:label "provider budget identifier" ;
    rdfs:comment "Native shared budget ID, qualified by budgetAccount. An unshared campaign allocation uses a campaign-qualified identifier in this profile." ; rdfs:range xsd:string .

:nativeBudgetType a rdf:Property ;
    rdfs:label "native Microsoft budget type" ;
    rdfs:comment "The explicitly reported BudgetType token retained on a qualified allocation. DailyBudgetStandard and DailyBudgetAccelerated retain distinct pacing evidence; LifetimeBudgetStandard qualifies the amount over the flight. Unknown tokens remain native evidence without a guessed shared period." ;
    rdfs:domain abg:Budget ; rdfs:range xsd:string .

:dailyTargetPeriod a abg:BudgetPeriod, skos:Concept ;
    skos:inScheme abg:BudgetPeriodScheme ;
    skos:closeMatch abg:dailyPeriod ;
    rdfs:label "Microsoft daily budget target period" ;
    rdfs:comment "A nominal per-day amount governed by Microsoft's delivery rules. The Campaign description calls DailyBudget a target whose actual spend may vary; BudgetLimitType distinguishes Standard and Accelerated pacing and describes accumulated monthly constraints. Those sources give different overspend bounds. This concept preserves the daily target meaning without publishing a numeric guarantee or a monthly amount. The native type remains necessary to inspect the provider's particular claim." ;
    skos:definition "A provider-governed nominal daily budget amount, qualified by native budget type and observation context." ;
    dcterms:source <https://learn.microsoft.com/en-us/advertising/campaign-management-service/campaign?view=bingads-13>,
        <https://learn.microsoft.com/en-us/advertising/campaign-management-service/budgetlimittype?view=bingads-13> .

:dailyBudgetField a skos:Concept ;
    rdfs:label "Microsoft DailyBudget field interpretation" ;
    rdfs:comment "Interpret the native Campaign DailyBudget amount together with BudgetType. DailyBudgetStandard and DailyBudgetAccelerated qualify dailyTargetPeriod; LifetimeBudgetStandard qualifies lifetimePeriod. The field name alone cannot establish the recurrence, and an echoed shared amount does not create a separate campaign allocation." ;
    skos:related :dailyTargetPeriod, abg:lifetimePeriod ;
    dcterms:source <https://relay.inferal.com/ontology/microsoftads/property/Microsoftads.CampaignManagementCampaign/dailyBudget> .

:standardConversions a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ; skos:broader adm:conversions ;
    rdfs:label "Microsoft standard conversions" ;
    rdfs:comment "ConversionsQualified fractional credit, excluding goals with ExcludeFromBidding=true. Never added to the overlapping all-goal measure." .
:allConversions a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ; skos:broader adm:conversions ;
    rdfs:label "Microsoft all-goal conversions" ;
    rdfs:comment "AllConversionsQualified fractional credit, including goals regardless of ExcludeFromBidding. This is a distinct, overlapping scope, not additional conversions." .
:standardRevenue a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ; skos:broader adm:conversionValue ;
    rdfs:label "Microsoft standard revenue" ;
    rdfs:comment "Revenue attributed to the standard conversion scope, denominated in the report currency." .
:allRevenue a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ; skos:broader adm:conversionValue ;
    rdfs:label "Microsoft all-goal revenue" ;
    rdfs:comment "AllRevenue attributed to all goals regardless of ExcludeFromBidding, denominated in the report currency." .
:undisclosedAttribution a adm:AttributionModel, skos:Concept ;
    skos:inScheme adm:AttributionModelScheme ;
    rdfs:label "Microsoft attribution configuration not supplied" ;
    rdfs:comment "An explicit absence of disclosed attribution settings, not a last-click assumption or a known common model. Bases are scoped to account, campaign, day, goal scope and delivery revision; consumers cannot assume comparability across them." .

:ConversionGoalObservation a rdfs:Class ;
    rdfs:label "conversion goal observation" ;
    rdfs:comment "A native conversion goal observed in one explicit account retrieval context at one instant. Customer scope expresses native sharing, not ownership by this account." .

:TrackingTagObservation a rdfs:Class ;
    rdfs:label "tracking tag observation" ;
    rdfs:comment "A native UET tag observed as accessible in an explicit account retrieval context at one instant. Retrieval access does not assert account ownership." .

:CampaignGoalReference a rdfs:Class ;
    rdfs:label "campaign goal reference" ;
    rdfs:comment "One positive goal ID explicitly listed on a retrieved campaign at an instant. It does not assert default goal selection, effective bidding membership or a successfully retrieved goal record." .

:conversionGoal a rdf:Property ;
    rdfs:label "retrieved conversion goal" ;
    rdfs:comment "A typed native conversion goal explicitly returned in this account snapshot. The request can be filtered or incomplete." .

:uetTag a rdf:Property ;
    rdfs:label "retrieved UET tag" ;
    rdfs:comment "A typed native UET tag returned in this retrieval context. Available customer tags may be shared across accounts." .

:controlAccount a rdf:Property ;
    rdfs:label "conversion control retrieval account" ;
    rdfs:comment "The shared advertising account identifying the observation retrieval context; this relation does not assert ownership of a customer-scoped goal or tag." ;
    rdfs:range aent:AdAccount .

:controlCampaign a rdf:Property ;
    rdfs:label "referencing campaign" ;
    rdfs:comment "The shared advertising campaign whose returned GoalIds list contains this explicit reference." ;
    rdfs:range aent:Campaign .

:providerGoalId a rdf:Property ;
    rdfs:label "provider conversion goal identifier" ;
    rdfs:comment "Exact positive native conversion goal ID represented as canonical numeric text. Its observation identity also includes retrieval account and instant." ;
    rdfs:range xsd:string .

:providerTagId a rdf:Property ;
    rdfs:label "provider UET tag identifier" ;
    rdfs:comment "Exact positive native UET tag ID represented as canonical numeric text. Missing tag records establish missing evidence only." ;
    rdfs:range xsd:string .

:goalType a rdf:Property ;
    rdfs:label "native conversion goal type" ;
    rdfs:comment "The explicitly returned native Type token. Unknown tokens are preserved; the field does not infer a concrete RDF subclass." ;
    rdfs:range xsd:string .

:goalName a rdf:Property ;
    rdfs:label "conversion goal name" ;
    rdfs:comment "The explicitly returned goal name at the observation instant." ;
    rdfs:range xsd:string .

:goalStatus a rdf:Property ;
    rdfs:label "native conversion goal status" ;
    rdfs:comment "The user-controlled native goal status, separate from system tracking status. Paused signals paused goal tracking." ;
    rdfs:range xsd:string .

:goalScope a rdf:Property ;
    rdfs:label "native conversion goal scope" ;
    rdfs:comment "The native Account or Customer scope token. Customer scope permits sharing and does not establish ownership by the retrieval account." ;
    rdfs:range xsd:string .

:goalCountType a rdf:Property ;
    rdfs:label "native conversion count mode" ;
    rdfs:comment "The explicitly returned count mode, such as All or Unique. Omitted modes remain unknown." ;
    rdfs:range xsd:string .

:excludeFromBidding a rdf:Property ;
    rdfs:label "exclude conversion goal from bidding" ;
    rdfs:comment "Explicit native exclusion from standard conversion reporting and automated bidding calculations. False does not establish automated bidding eligibility; missing values remain unknown." ;
    rdfs:range xsd:boolean .

:goalTrackingStatus a rdf:Property ;
    rdfs:label "native goal tracking status" ;
    rdfs:comment "Explicit system tracking signal. TagInactive may represent tag inactivity or lost tag access unless the additional unavailable-tag field was requested; NoRecentConversions does not establish a broken tag." ;
    rdfs:range xsd:string .

:conversionWindowMinutes a rdf:Property ;
    rdfs:label "conversion window in minutes" ;
    rdfs:comment "The explicitly returned click conversion window in native minutes, from 1 through 129600. This is configuration at one instant, not historical attribution comparability." ;
    rdfs:range xsd:int .

:attributionModel a rdf:Property ;
    rdfs:label "native goal attribution model" ;
    rdfs:comment "The explicitly returned attribution model token. The field is not returned by default and is inapplicable to some goal types; absence does not imply LastClick." ;
    rdfs:range xsd:string .

:tagName a rdf:Property ;
    rdfs:label "UET tag name" ;
    rdfs:comment "The explicitly returned UET tag name at the observation instant." ;
    rdfs:range xsd:string .

:tagTrackingStatus a rdf:Property ;
    rdfs:label "native UET tag tracking status" ;
    rdfs:comment "The explicitly returned tag activity signal, such as Active, Inactive or Unverified. It is distinct from goal tracking status and does not diagnose a website outage." ;
    rdfs:range xsd:string .


# Hold kinds for Microsoft values that stop delivery without naming a cause the
# shared module models.

:campaignSuspendedHold
    a adel:HoldKind, skos:Concept ;
    skos:inScheme adel:HoldKindScheme ;
    skos:broader adel:unclassifiedHold ;
    rdfs:label "campaign suspended" ;
    rdfs:comment "Microsoft defines a Suspended campaign as one that has been suspended because of suspicious activity, so no ads are eligible for delivery. The definition names no review, payment, allowance, schedule or account restriction, so the hold falls under the shared unclassified hold." .

:StatusDerivedDeliveryState a rdfs:Class ;
    rdfs:subClassOf adel:DeliveryState ;
    rdfs:label "status-derived delivery state" ;
    rdfs:comment "Account, ad-group or ad controls derived from a native status at a scoped retrieval instant. The native status and selected holds do not establish actual serving or complete eligibility. Such a state retains source and snapshot provenance and supplies no observedServing value. Missing, unsupported or conflicting statuses remain outside this class's current projection contract." .

:nativeStatus a rdf:Property ;
    rdfs:label "native delivery-control status" ;
    rdfs:comment "The exact native status token of the account, ad-group or ad record supporting this status-derived state. It records the source evidence without asserting measured delivery or the correctness of every shared intent interpretation." ;
    rdfs:domain :StatusDerivedDeliveryState ;
    rdfs:range xsd:string .

:servingEvidence a rdf:Property ;
    rdfs:label "serving evidence disposition" ;
    rdfs:comment "The not-observed token records that this status-derived state contains no actual-serving observation. It establishes neither serving nor non-serving. Actual-serving evidence requires a separately qualified observation contract; this profile does not infer or map it." ;
    rdfs:domain :StatusDerivedDeliveryState ;
    rdfs:range xsd:string .

:CampaignDeliveryObservation a rdfs:Class ;
    rdfs:label "campaign delivery-control observation" ;
    rdfs:comment "Native campaign-status evidence for one source record at one account-scoped retrieval instant. Known status controls reuse shared intent, lifecycle and hold terms. Missing, unknown and conflicting evidence remains explicit. Status-only evidence is not a shared DeliveryState and never establishes actual serving." .

:sourceSnapshot a rdf:Property ; rdfs:label "source snapshot" ;
    rdfs:comment "The named retrieval envelope supporting this observation, or a deterministic local capture handle for an anonymous source. Original source nodes remain provenance evidence. No complete account enumeration or provider-assigned handle is implied." ;
    rdfs:domain :CampaignDeliveryObservation .
:sourceCampaign a rdf:Property ; rdfs:label "source campaign record" ;
    rdfs:comment "The named native campaign record included in the snapshot, or a deterministic local reading handle for an anonymous source. Local handles preserve account, campaign, capture and status evidence; indistinguishable anonymous readings may share a handle. They are not provider-assigned campaign identifiers." ;
    rdfs:domain :CampaignDeliveryObservation .
:nativeCampaignStatus a rdf:Property ; rdfs:label "native campaign status" ;
    rdfs:comment "The explicitly supplied campaign status token, including unrecognized values. Absence is represented by missing evidence rather than a default status." ;
    rdfs:domain :CampaignDeliveryObservation ; rdfs:range xsd:string .
:statusEvidence a rdf:Property ; rdfs:label "campaign status evidence disposition" ;
    rdfs:comment "Known, missing, unknown or conflicting status evidence. Conflicting explicitly supplied statuses for the same account, campaign and instant suppress derived controls without dropping their source observations." ;
    rdfs:domain :CampaignDeliveryObservation ; rdfs:range xsd:string .
:nativeEligibility a rdf:Property ; rdfs:label "native campaign eligibility" ;
    rdfs:comment "Eligible or ineligible under the known native campaign condition alone. Eligible does not establish serving, complete eligibility under ancestor conditions or an effective bid decision." ;
    rdfs:domain :CampaignDeliveryObservation ; rdfs:range xsd:string .
:manualPaused a rdf:Property ; rdfs:label "manual campaign pause control" ;
    rdfs:comment "Explicit native manual pause control: true for Paused and BudgetAndManualPaused, false for Active and BudgetPaused, absent when the native status does not establish it." ;
    rdfs:domain :CampaignDeliveryObservation ; rdfs:range xsd:boolean .
:budgetPaused a rdf:Property ; rdfs:label "budget campaign pause control" ;
    rdfs:comment "Explicit native budget pause control: true for BudgetPaused and BudgetAndManualPaused, false for Active and Paused, absent when the native status does not establish it. This does not measure spending or infer a breach." ;
    rdfs:domain :CampaignDeliveryObservation ; rdfs:range xsd:boolean .
:reportedIntent a rdf:Property ; rdfs:label "reported campaign delivery intent" ;
    rdfs:comment "Shared delivery intent supported by a known native campaign status. Suspended and Deleted establish no advertiser intent in this profile." ;
    rdfs:domain :CampaignDeliveryObservation ; rdfs:range adel:DeliveryIntent .
:campaignLifecycle a rdf:Property ; rdfs:label "reported campaign lifecycle" ;
    rdfs:comment "Shared live or removed standing supported by explicit known native campaign status. Removed requires explicitly supplied Deleted evidence; a missing Get result never supplies it." ;
    rdfs:domain :CampaignDeliveryObservation ; rdfs:range adel:LifecycleState .
:reportedHold a rdf:Property ; rdfs:label "reported campaign serving hold" ;
    rdfs:comment "A shared serving hold supported by the campaign status crosswalk and originating at that campaign. Budget pauses retain allowance exhaustion; Suspended retains the provider's unclassified hold without a guessed root cause or ancestor hold." ;
    rdfs:domain :CampaignDeliveryObservation ; rdfs:range adel:ServingHold .
:observedServing a rdf:Property ; rdfs:label "observed campaign serving" ;
    rdfs:comment "Reserved observation axis for independently supplied serving evidence. The native campaign-status projection never supplies this property because eligibility and pause controls are not measurements of actual serving." ;
    rdfs:domain :CampaignDeliveryObservation ; rdfs:range adel:ServingState .

:proposedAccountHold
    a adel:HoldKind, skos:Concept ;
    skos:inScheme adel:HoldKindScheme ;
    skos:broader adel:unclassifiedHold ;
    rdfs:label "account proposed" ;
    rdfs:comment "Microsoft defines a Proposed advertiser account as one that can add campaigns while the service will not deliver its ads. The definition names no cause, so the hold falls under the shared unclassified hold." .

# Microsoft status values linked to shared hold kinds. Each link rests on the
# value's definition in the delivered import, which quotes Microsoft's API
# reference.

# CampaignStatus: BudgetPaused, "The service sets this status when the budget is
# depleted"; BudgetAndManualPaused, a user paused a budget-paused campaign;
# Suspended, "no ads are eligible for delivery".
<https://relay.inferal.com/ontology/microsoftads/CampaignManagementCampaignStatus/BudgetPaused> skos:broadMatch adel:allowanceExhaustedHold .
<https://relay.inferal.com/ontology/microsoftads/CampaignManagementCampaignStatus/BudgetAndManualPaused> skos:broadMatch adel:allowanceExhaustedHold .
<https://relay.inferal.com/ontology/microsoftads/CampaignManagementCampaignStatus/Suspended> skos:broadMatch :campaignSuspendedHold .

# AdGroupStatus and AssetGroupStatus Expired: the end date has passed.
<https://relay.inferal.com/ontology/microsoftads/CampaignManagementAdGroupStatus/Expired> skos:broadMatch adel:outsideScheduleHold .
<https://relay.inferal.com/ontology/microsoftads/CampaignManagementAssetGroupStatus/Expired> skos:broadMatch adel:outsideScheduleHold .

# AdStatus Inactive: "undergoing editorial review or has failed editorial
# review". Editorial Disapproved: "failed editorial review"; Inactive: an element
# "is undergoing editorial review".
<https://relay.inferal.com/ontology/microsoftads/CampaignManagementAdStatus/Inactive> skos:broadMatch adel:policyReviewHold .
<https://relay.inferal.com/ontology/microsoftads/CampaignManagementAdEditorialStatus/Disapproved> skos:broadMatch adel:policyReviewHold .
<https://relay.inferal.com/ontology/microsoftads/CampaignManagementAdEditorialStatus/Inactive> skos:broadMatch adel:policyReviewHold .
<https://relay.inferal.com/ontology/microsoftads/CampaignManagementAssetGroupEditorialStatus/Disapproved> skos:broadMatch adel:policyReviewHold .
<https://relay.inferal.com/ontology/microsoftads/CampaignManagementAssetGroupEditorialStatus/Inactive> skos:broadMatch adel:policyReviewHold .

# AdGroupPrivacyStatus: TargetingTooNarrow, "not eligible to serve because your ad
# group target criteria ... are too narrowly defined"; Pending, "The privacy
# evaluation is still in progress".
<https://relay.inferal.com/ontology/microsoftads/CampaignManagementAdGroupPrivacyStatus/TargetingTooNarrow> skos:broadMatch adel:configurationHold .
<https://relay.inferal.com/ontology/microsoftads/CampaignManagementAdGroupPrivacyStatus/Pending> skos:broadMatch adel:processingHold .

# AccountLifeCycleStatus: Suspended, "no ads are eligible for delivery"; Inactive,
# deactivated "as it generated no traffic for 15 months".
<https://relay.inferal.com/ontology/microsoftads/CustomerManagementAccountLifeCycleStatus/Suspended> skos:broadMatch adel:accountRestrictionHold .
<https://relay.inferal.com/ontology/microsoftads/CustomerManagementAccountLifeCycleStatus/Inactive> skos:broadMatch adel:accountRestrictionHold .

# AccountFinancialStatus: Hold, "The service will not deliver the account's ads
# until the account is settled"; WriteOff, past due with collection no longer
# pursued; Proposed, "the service will not deliver the account's ads".
<https://relay.inferal.com/ontology/microsoftads/CustomerManagementAccountFinancialStatus/Hold> skos:broadMatch adel:billingHold .
<https://relay.inferal.com/ontology/microsoftads/CustomerManagementAccountFinancialStatus/WriteOff> skos:broadMatch adel:billingHold .
<https://relay.inferal.com/ontology/microsoftads/CustomerManagementAccountFinancialStatus/Proposed> skos:broadMatch :proposedAccountHold .
