@prefix : <https://ontology.inferal.com/profiles/relay-advertising/meta/> .
@prefix abg: <https://ontology.inferal.com/modules/advertising-budget/> .
@prefix adel: <https://ontology.inferal.com/modules/advertising-delivery-state/> .
@prefix adm: <https://ontology.inferal.com/modules/advertising-measurement/> .
@prefix aent: <https://ontology.inferal.com/modules/advertising-entity/> .
@prefix dcat: <http://www.w3.org/ns/dcat#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix inferal-catalog: <https://ontology.inferal.com/catalog/> .
@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 rng: <https://ontology.inferal.com/modules/range/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix vann: <http://purl.org/vocab/vann/> .
@prefix voaf: <http://purl.org/vocommons/voaf#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

:
    a owl:Ontology, prof:Profile, mod:SemanticArtefact, voaf:Vocabulary,
      pubacc:PublicationManagedOntology ;
    dcterms:accessRights pubacc:PublicAccess ;
    owl:imports adm: , abg: , adel: , aent: ;
    dcterms:title "Relay Advertising Profile: Meta" ;
    dcterms:description "Maps the values Meta actually sends onto the advertising measurement, budget, and delivery-state vocabularies, and records where the wire form carries less than the shared model asks for." ;
    dcterms:license <https://creativecommons.org/licenses/by/4.0/> ;
    dcterms:source adm: , abg: , adel: , aent: ;
    vann:preferredNamespacePrefix "meta-adv" ;
    vann:preferredNamespaceUri "https://ontology.inferal.com/profiles/relay-advertising/meta/" ;
    mod:status "draft" ;
    rdfs:comment "Written from the modelled Meta surface rather than from an idealised one, so it records absences as well as mappings. Two matter. Meta sends no attribution model, only a lookback duration crossed with an interaction kind, so every basis derived from it names the provider's undisclosed rule. Meta sends outcome counts in an open bag keyed by free-text action types, so this profile subsumes the well-known keys under shared metric kinds and leaves the rest provider-local. Partitioning arrives separated: Meta returns each requested breakdown as its own column of an insights row, and each column this profile maps, age, gender, publisher_platform, platform_position, country, device_platform and impression_device, lowers to one breakdown." ;
    owl:versionInfo "0.1.0" .


# --- Channel -----------------------------------------------------------------

:metaChannelAlignment
    a rdf:Statement ;
    rdfs:label "Meta buys through the Meta channel" ;
    rdfs:comment "The channel is the platform bought through. It is not the publisher property: one Meta purchase delivers across Facebook, Instagram, Messenger, and the audience network, and the property is a breakdown rather than the channel." ;
    rdf:subject :metaChannelAlignment ;
    rdf:predicate skos:exactMatch ;
    rdf:object adm:metaChannel .


# --- Publisher platforms -----------------------------------------------------
#
# Meta reports the property an ad ran on separately from the position within it.
# The wire values are lowercase identifiers; these concepts carry them as hidden
# labels so a lowering can look a value up without the label leaking into the
# shared vocabulary.

:facebookProperty
    a adm:PublisherPlatform, skos:Concept ;
    skos:inScheme adm:PublisherPlatformScheme ;
    skos:broader adm:facebookPlatform ;
    rdfs:label "Facebook" ;
    rdfs:comment "Delivery on Facebook." ;
    skos:hiddenLabel "facebook" .

:instagramProperty
    a adm:PublisherPlatform, skos:Concept ;
    skos:inScheme adm:PublisherPlatformScheme ;
    skos:broader adm:instagramPlatform ;
    rdfs:label "Instagram" ;
    rdfs:comment "Delivery on Instagram." ;
    skos:hiddenLabel "instagram" .

:messengerProperty
    a adm:PublisherPlatform, skos:Concept ;
    skos:inScheme adm:PublisherPlatformScheme ;
    skos:broader adm:messengerPlatform ;
    rdfs:label "Messenger" ;
    rdfs:comment "Delivery in Messenger." ;
    skos:hiddenLabel "messenger" .

:audienceNetworkProperty
    a adm:PublisherPlatform, skos:Concept ;
    skos:inScheme adm:PublisherPlatformScheme ;
    skos:broader adm:audienceNetworkPlatform ;
    rdfs:label "Audience Network" ;
    rdfs:comment "Delivery on third-party inventory syndicated by Meta." ;
    skos:hiddenLabel "audience_network" .

:threadsProperty
    a adm:PublisherPlatform, skos:Concept ;
    skos:inScheme adm:PublisherPlatformScheme ;
    rdfs:label "Threads" ;
    rdfs:comment "Delivery on Threads. No cross-provider anchor exists, so this stays provider-local rather than being forced under one." ;
    skos:hiddenLabel "threads" .

:unknownProperty
    a adm:PublisherPlatform, skos:Concept ;
    skos:inScheme adm:PublisherPlatformScheme ;
    skos:broader adm:unknownPlatform ;
    rdfs:label "unknown property" ;
    rdfs:comment "Meta reports this materially rather than rarely. Dropping such rows understates any platform-partitioned total." ;
    skos:hiddenLabel "unknown" .


# --- Placements --------------------------------------------------------------
#
# Positions within a property, as Meta returns them in the platform_position
# column beside the publisher_platform column. Meta names several positions
# after the property they appear on; each column lowers to its own breakdown.
# Meta's bid multiplier guide describes positions in words beside a value that
# joins the publisher platform and the targeting position, such as Facebook
# Business Explore for facebook_biz_disco_feed. A position the guide describes
# once carries that description as skos:altLabel; feed and in-stream video,
# which it describes once per platform, carry none.

:feedPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:feedPlacement ;
    rdfs:label "feed"  ;
    rdfs:comment "An in-feed position. The only position Meta names without embedding the property it appears on." ;
    skos:hiddenLabel "feed" .

:facebookStoriesPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:storiesPlacement ;
    rdfs:label "Facebook stories" ;
    skos:altLabel "Facebook Stories" ;
    rdfs:comment "A stories position on Facebook. The property is already implied by the name, which is the redundancy the joined dimension creates." ;
    skos:hiddenLabel "facebook_stories" .

:instagramStoriesPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:storiesPlacement ;
    rdfs:label "Instagram stories"  ;
    skos:altLabel "Instagram Stories" ;
    rdfs:comment "A stories position on Instagram." ;
    skos:hiddenLabel "instagram_stories" .

:messengerStoriesPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:storiesPlacement ;
    rdfs:label "Messenger stories"  ;
    skos:altLabel "Messenger Stories" ;
    rdfs:comment "A stories position in Messenger." ;
    skos:hiddenLabel "messenger_stories" .

:facebookReelsPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:reelsPlacement ;
    rdfs:label "Facebook reels"  ;
    skos:altLabel "Facebook Reels" ;
    rdfs:comment "A reels position on Facebook." ;
    skos:hiddenLabel "facebook_reels" .

:instagramReelsPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:reelsPlacement ;
    rdfs:label "Instagram reels"  ;
    skos:altLabel "Instagram Reels" ;
    rdfs:comment "A reels position on Instagram." ;
    skos:hiddenLabel "instagram_reels" .

:marketplacePosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:marketplacePlacement ;
    rdfs:label "marketplace"  ;
    skos:altLabel "Facebook Marketplace" ;
    rdfs:comment "A position within Marketplace listings." ;
    skos:hiddenLabel "marketplace" .

:rightHandColumnPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:sidebarPlacement ;
    rdfs:label "right-hand column"  ;
    skos:altLabel "Facebook right column" ;
    rdfs:comment "A position in the column beside the main content, on desktop only." ;
    skos:hiddenLabel "right_hand_column" .

:inStreamVideoPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:inStreamVideoPlacement ;
    rdfs:label "in-stream video"  ;
    rdfs:comment "A position inside video playback." ;
    skos:hiddenLabel "instream_video" .

:searchPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:inAppSearchResultsPlacement ;
    rdfs:label "search"  ;
    skos:altLabel "Facebook search results" ;
    rdfs:comment "A position on the results of a search inside Facebook, which Meta's bid multiplier guide describes as Facebook search results. It sits under the shared in-app search results placement and not under the shared search results placement, a surface on a search engine results page." ;
    skos:hiddenLabel "search" .

:videoFeedsPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:videoFeedPlacement ;
    rdfs:label "video feeds"  ;
    skos:altLabel "Facebook video feeds" ;
    rdfs:comment "A position within a browsable video surface, distinct from playback itself." ;
    skos:hiddenLabel "video_feeds" .

:instagramExplorePosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    rdfs:label "Instagram Explore" ;
    skos:altLabel "Instagram Explore" ;
    rdfs:comment "A position in Instagram Explore, one of the four Instagram placement locations Meta's Instagram ad insights guide names. No shared placement anchors it, so it stays provider-local like the Threads property." ;
    skos:hiddenLabel "instagram_explore" .

:instagramExploreHomePosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    rdfs:label "Instagram Explore home" ;
    skos:altLabel "Instagram Explore home" ;
    rdfs:comment "A position on Instagram Explore home, which Meta's v25 Ad Set Insights sample returns as instagram_explore_grid_home and its bid multiplier guide describes as Instagram Explore home, a position apart from Instagram Explore. No shared placement anchors it." ;
    skos:hiddenLabel "instagram_explore_grid_home" .

:threadsFeedPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:feedPlacement ;
    rdfs:label "Threads feed" ;
    rdfs:comment "An in-feed position on Threads, the one Threads placement Meta names." ;
    skos:hiddenLabel "threads_feed" .

:facebookProfileFeedPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:feedPlacement ;
    rdfs:label "Facebook profile feed" ;
    rdfs:comment "A feed position on Facebook, which Meta's placement targeting reference names profile_feed among the Facebook positions and Insights returns as facebook_profile_feed." ;
    skos:hiddenLabel "facebook_profile_feed" .

:facebookReelsOverlayPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:reelsPlacement ;
    rdfs:label "Facebook reels overlay" ;
    skos:altLabel "Ads on Facebook Reels" ;
    rdfs:comment "A position within Facebook reels that Meta reports apart from facebook_reels. Meta's placement targeting reference names it among the Facebook positions, its bid multiplier guide describes it as Ads on Facebook Reels, and its publisher delivery report lists facebook_reels_overlay as an ads reporting position." ;
    skos:hiddenLabel "facebook_reels_overlay" .

:facebookNotificationPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    rdfs:label "Facebook notification" ;
    rdfs:comment "A Facebook position, which Meta's placement targeting reference names notification among the Facebook positions and does not define. No shared placement describes it, so it stays provider-local." ;
    skos:hiddenLabel "facebook_notification" .

:bizDiscoFeedPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    rdfs:label "Facebook biz_disco_feed" ;
    skos:altLabel "Facebook Business Explore" ;
    rdfs:comment "A Facebook position, which Meta's bid multiplier guide describes as Facebook Business Explore under the value facebook_biz_disco_feed, the targeting position biz_disco_feed prefixed with the platform. Insights returns the targeting position, biz_disco_feed, in the platform_position column. Meta's placement targeting reference does not name it. No shared placement describes it." ;
    skos:hiddenLabel "biz_disco_feed" .

:instagramSearchPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    skos:broader adm:inAppSearchResultsPlacement ;
    rdfs:label "Instagram search" ;
    skos:altLabel "Instagram search results" ;
    rdfs:comment "A position on the results of a search inside Instagram, which Meta's placement targeting reference names ig_search among the Instagram positions and its bid multiplier guide describes as Instagram search results. It sits under the shared in-app search results placement, beside Facebook search." ;
    skos:hiddenLabel "instagram_search" .

:audienceNetworkClassicPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    rdfs:label "Audience Network classic" ;
    skos:altLabel "Audience Network native, banner, and interstitial" ;
    rdfs:comment "An Audience Network position, which Meta's placement targeting reference names classic among the Audience Network positions, beside rewarded_video. Its bid multiplier guide describes it as Audience Network native, banner, and interstitial under the value audience_network_classic, and its publisher delivery report lists an_classic as an ads reporting position. No shared placement describes it, so it stays provider-local." ;
    skos:hiddenLabel "an_classic" .

:unknownPosition
    a adm:PlacementSurface, skos:Concept ;
    skos:inScheme adm:PlacementScheme ;
    rdfs:label "position unknown" ;
    rdfs:comment "Delivery whose position Meta does not report, returned as unknown in the platform_position column beside publisher_platform unknown. The measurement module declares no unknown placement, so this value has no broader shared placement." ;
    skos:hiddenLabel "unknown" .


# --- Demographics ------------------------------------------------------------
#
# Meta returns the age range and gender of the people reached as the age and
# gender breakdown columns of an insights row. The gender values are declared
# here with their wire tokens. Age ranges are Meta's own bands, and the Meta
# mapping mints one value per range token in the age band scheme. The unknown
# age, which Meta returns as Unknown, is declared here with its wire token.

:GenderScheme
    a skos:ConceptScheme ;
    rdfs:label "Meta gender scheme" ;
    rdfs:comment "The gender values Meta returns in the gender breakdown column of an insights row." ;
    skos:prefLabel "Meta genders" .

:femaleGender
    a skos:Concept ;
    skos:inScheme :GenderScheme ;
    rdfs:label "female" ;
    rdfs:comment "People Meta reports as female." ;
    skos:hiddenLabel "female" .

:maleGender
    a skos:Concept ;
    skos:inScheme :GenderScheme ;
    rdfs:label "male" ;
    rdfs:comment "People Meta reports as male." ;
    skos:hiddenLabel "male" .

:unknownGender
    a skos:Concept ;
    skos:inScheme :GenderScheme ;
    rdfs:label "gender not specified" ;
    rdfs:comment "People who list no gender. Meta's breakdowns guide says they are shown as not specified, and its v25 Insights sample returns unknown for them; both tokens name this value." ;
    skos:hiddenLabel "unknown" , "not specified" .

:ageBandScheme
    a skos:ConceptScheme ;
    rdfs:label "Meta age band scheme" ;
    rdfs:comment "The age values Meta returns in the age breakdown column of an insights row: age ranges such as 25-34 or 65+, and Unknown. The age range members are not declared here: the Meta mapping mints one per Meta age range token, and each carries its token as skos:notation. The unknown age is declared here as meta-adv:unknownAgeBand." ;
    skos:prefLabel "Meta age bands" .

:unknownAgeBand
    a skos:Concept ;
    skos:inScheme :ageBandScheme ;
    rdfs:label "age unknown" ;
    rdfs:comment "People whose age Meta does not know, returned as Unknown in the age breakdown column beside the age ranges." ;
    skos:hiddenLabel "Unknown" .


# --- Countries ---------------------------------------------------------------
#
# Meta returns the country of the people reached as an ISO 3166-1 alpha-2 code
# in the country breakdown column of an insights row. The Meta mapping lowers
# each code the OMG LCC ISO 3166-1 country codes list to the LCC country
# individual it denotes, and this profile does not redeclare those individuals.
# Meta also returns XK for Kosovo and unknown for people it cannot place; each
# is declared here with its wire token.

:CountryScheme
    a skos:ConceptScheme ;
    rdfs:label "Meta country scheme" ;
    rdfs:comment "The values Meta returns in the country breakdown column of an insights row that denote no OMG LCC country individual." ;
    skos:prefLabel "Meta countries" .

:kosovoCountry
    a skos:Concept ;
    skos:inScheme :CountryScheme ;
    rdfs:label "Kosovo" ;
    rdfs:comment "People Meta places in Kosovo, returned as XK. ISO 3166-1 assigns no code to Kosovo, and the OMG LCC country codes name no country for it." ;
    skos:hiddenLabel "XK" .

:unknownCountry
    a skos:Concept ;
    skos:inScheme :CountryScheme ;
    rdfs:label "country unknown" ;
    rdfs:comment "People Meta places in no country, returned as unknown." ;
    skos:hiddenLabel "unknown" .


# --- Devices -----------------------------------------------------------------
#
# Meta returns two device breakdown columns on an insights row. device_platform
# names the kind of surface, desktop, mobile app or mobile web, and lowers to a
# breakdown on adm:deviceDimension. impression_device names the device family
# the ad was served on, such as iphone or android_tablet, and lowers to a
# breakdown on the impression device dimension declared here. The two columns
# partition the same totals along different lines: neither dimension is
# narrower than the other, and a desktop device platform and a desktop
# impression device are separate values.

:impressionDeviceDimension
    a adm:BreakdownDimension, skos:Concept ;
    skos:inScheme adm:BreakdownDimensionScheme ;
    rdfs:label "impression device dimension" ;
    skos:prefLabel "impression device" ;
    rdfs:comment "Partition by the device family an ad was served on, as Meta returns it in the impression_device breakdown column, such as iPhone or Android tablet. It partitions the same totals as adm:deviceDimension along different lines and is not narrower than it." .

:DevicePlatformScheme
    a skos:ConceptScheme ;
    rdfs:label "Meta device platform scheme" ;
    rdfs:comment "The values Meta returns in the device_platform breakdown column of an insights row." ;
    skos:prefLabel "Meta device platforms" .

:desktopDevicePlatform
    a skos:Concept ;
    skos:inScheme :DevicePlatformScheme ;
    rdfs:label "desktop" ;
    rdfs:comment "People Meta reports as viewing or clicking the ad on a desktop computer, returned as desktop in the device_platform column." ;
    skos:hiddenLabel "desktop" .

:mobileAppDevicePlatform
    a skos:Concept ;
    skos:inScheme :DevicePlatformScheme ;
    rdfs:label "mobile app" ;
    rdfs:comment "People Meta reports as viewing or clicking the ad in a mobile app, returned as mobile_app." ;
    skos:hiddenLabel "mobile_app" .

:mobileWebDevicePlatform
    a skos:Concept ;
    skos:inScheme :DevicePlatformScheme ;
    rdfs:label "mobile web" ;
    rdfs:comment "People Meta reports as viewing or clicking the ad in a mobile web browser, returned as mobile_web." ;
    skos:hiddenLabel "mobile_web" .

:unknownDevicePlatform
    a skos:Concept ;
    skos:inScheme :DevicePlatformScheme ;
    rdfs:label "device platform unknown" ;
    rdfs:comment "People whose device platform Meta does not report, returned as unknown in the device_platform column." ;
    skos:hiddenLabel "unknown" .

:ImpressionDeviceScheme
    a skos:ConceptScheme ;
    rdfs:label "Meta impression device scheme" ;
    rdfs:comment "The values Meta returns in the impression_device breakdown column of an insights row." ;
    skos:prefLabel "Meta impression devices" .

:iphoneImpressionDevice
    a skos:Concept ;
    skos:inScheme :ImpressionDeviceScheme ;
    rdfs:label "iPhone" ;
    rdfs:comment "Ads Meta served on an iPhone, returned as iphone." ;
    skos:hiddenLabel "iphone" .

:androidSmartphoneImpressionDevice
    a skos:Concept ;
    skos:inScheme :ImpressionDeviceScheme ;
    rdfs:label "Android smartphone" ;
    rdfs:comment "Ads Meta served on an Android smartphone, returned as android_smartphone." ;
    skos:hiddenLabel "android_smartphone" .

:ipadImpressionDevice
    a skos:Concept ;
    skos:inScheme :ImpressionDeviceScheme ;
    rdfs:label "iPad" ;
    rdfs:comment "Ads Meta served on an iPad, returned as ipad." ;
    skos:hiddenLabel "ipad" .

:androidTabletImpressionDevice
    a skos:Concept ;
    skos:inScheme :ImpressionDeviceScheme ;
    rdfs:label "Android tablet" ;
    rdfs:comment "Ads Meta served on an Android tablet, returned as android_tablet." ;
    skos:hiddenLabel "android_tablet" .

:desktopImpressionDevice
    a skos:Concept ;
    skos:inScheme :ImpressionDeviceScheme ;
    rdfs:label "desktop impression device" ;
    rdfs:comment "Ads Meta served on a desktop computer, returned as desktop in the impression_device column. A separate value from the desktop device platform, in a separate dimension." ;
    skos:hiddenLabel "desktop" .

:ipodImpressionDevice
    a skos:Concept ;
    skos:inScheme :ImpressionDeviceScheme ;
    rdfs:label "iPod" ;
    rdfs:comment "Ads Meta served on an iPod, returned as ipod." ;
    skos:hiddenLabel "ipod" .

:otherImpressionDevice
    a skos:Concept ;
    skos:inScheme :ImpressionDeviceScheme ;
    rdfs:label "other impression device" ;
    rdfs:comment "Ads Meta served on a device it reports as none of the named families, returned as other." ;
    skos:hiddenLabel "other" .


# --- Attribution -------------------------------------------------------------
#
# Meta ships attribution as an interaction kind crossed with a duration, and
# names no model. Every basis derived from Meta therefore states the provider's
# undisclosed rule, which is a claim rather than a placeholder: Meta's rule is
# genuinely proprietary and is not interchangeable with another provider's.

:oneDayLookback
    a rng:Range ;
    rdfs:label "one day lookback"  ;
    rdfs:comment "One day before the outcome." .

:sevenDayLookback
    a rng:Range ;
    rdfs:label "seven day lookback"  ;
    rdfs:comment "Seven days before the outcome." .

:twentyEightDayLookback
    a rng:Range ;
    rdfs:label "twenty-eight day lookback"  ;
    rdfs:comment "Twenty-eight days before the outcome." .

:clickOneDayBasis
    a adm:AttributionBasis ;
    rdfs:label "Meta, click-through, one day"  ;
    rdfs:comment "Credits a click within a day of the outcome, as the 1d_click key of a Meta action stats entry reports it. Meta also reports one-day view-through and one-day engaged-view windows, under 1d_view and 1d_ev." ;
    skos:hiddenLabel "1d_click" ;
    adm:usedAttributionModel adm:providerProprietaryModel ;
    adm:creditedInteraction adm:clickThroughCredit ;
    adm:lookbackWindow :oneDayLookback .

:clickSevenDayBasis
    a adm:AttributionBasis ;
    rdfs:label "Meta, click-through, seven days"  ;
    rdfs:comment "Credits a click within seven days of the outcome, as the 7d_click key of a Meta action stats entry reports it." ;
    skos:hiddenLabel "7d_click" ;
    adm:usedAttributionModel adm:providerProprietaryModel ;
    adm:creditedInteraction adm:clickThroughCredit ;
    adm:lookbackWindow :sevenDayLookback .

:clickTwentyEightDayBasis
    a adm:AttributionBasis ;
    rdfs:label "Meta, click-through, twenty-eight days"  ;
    rdfs:comment "Credits a click within four weeks of the outcome. Produces materially larger counts than the seven-day window on the same campaign." ;
    skos:hiddenLabel "28d_click" ;
    adm:usedAttributionModel adm:providerProprietaryModel ;
    adm:creditedInteraction adm:clickThroughCredit ;
    adm:lookbackWindow :twentyEightDayLookback .

:viewOneDayBasis
    a adm:AttributionBasis ;
    rdfs:label "Meta, view-through, one day" ;
    rdfs:comment "View-through figures run far larger than click-through ones on the same campaign. Before this distinction was modelled the two summed together silently." ;
    skos:hiddenLabel "1d_view" ;
    adm:usedAttributionModel adm:providerProprietaryModel ;
    adm:creditedInteraction adm:viewThroughCredit ;
    adm:lookbackWindow :oneDayLookback .

:unstatedBasis
    a adm:AttributionBasis ;
    rdfs:label "Meta, attribution windows not stated" ;
    rdfs:comment "The basis of the value key of a Meta action stats entry. Since June 10, 2025, Meta bases an attributed value on the ad set's attribution setting, which the insights row does not state in a documented form. This basis carries no lookback window and no credited interaction, and fails any comparability check against a stated basis." ;
    adm:usedAttributionModel adm:providerProprietaryModel .


# --- Outcome kinds -----------------------------------------------------------
#
# Meta returns outcome counts in an open bag keyed by free-text action types.
# The well-known keys are subsumed under shared metric kinds; the rest stay
# provider-local, which is the honest treatment of an open vocabulary.
#
# Meta reports purchases, leads and adds to cart both as grouped types and as
# channel types. Each grouped kind is narrower than adm:conversions, and each
# channel kind is narrower than its grouped kind. A grouped kind and its
# narrower kinds count overlapping outcomes and are not summed together.

:allPurchasesOutcome
    a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader adm:conversions ;
    rdfs:label "all purchases" ;
    rdfs:comment "Meta's grouped purchase type, listed among Meta's grouped action types as Purchases. The website, On-Facebook and mobile-app purchase kinds of this profile are narrower than it; its count and theirs cover overlapping outcomes and are not summed together." ;
    skos:definition "A count of the purchase outcomes Meta reports under its grouped purchase type within the reporting window." ;
    skos:hiddenLabel "omni_purchase" .

:purchaseOutcome
    a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader :allPurchasesOutcome ;
    rdfs:label "website purchase" ;
    rdfs:comment "A purchase on the advertiser's website, credited by the Meta pixel." ;
    skos:definition "A count of website purchase outcomes credited by the Meta pixel within the reporting window." ;
    skos:hiddenLabel "offsite_conversion.fb_pixel_purchase" .

:onFacebookPurchaseOutcome
    a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader :allPurchasesOutcome ;
    rdfs:label "On-Facebook purchase" ;
    rdfs:comment "A purchase Meta reports under its On-Facebook Purchases type." ;
    skos:definition "A count of On-Facebook purchase outcomes within the reporting window." ;
    skos:hiddenLabel "onsite_conversion.purchase" .

:mobileAppPurchaseOutcome
    a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader :allPurchasesOutcome ;
    rdfs:label "mobile app purchase" ;
    rdfs:comment "A purchase in the advertiser's mobile app, reported under Meta's Mobile App Purchases type." ;
    skos:definition "A count of mobile-app purchase outcomes within the reporting window." ;
    skos:hiddenLabel "app_custom_event.fb_mobile_purchase" .

:allLeadsOutcome
    a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader adm:conversions ;
    rdfs:label "all leads" ;
    rdfs:comment "Meta's grouped lead type, which Meta describes as all offsite leads plus all On-Facebook leads. It counts the website and On-Facebook leads its narrower kinds count. Its count and theirs cover overlapping outcomes and are not summed together." ;
    skos:definition "A count of offsite and On-Facebook lead outcomes within the reporting window." ;
    skos:hiddenLabel "lead" .

:leadOutcome
    a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader :allLeadsOutcome ;
    rdfs:label "website lead" ;
    rdfs:comment "A lead submitted on the advertiser's website, credited by the Meta pixel." ;
    skos:definition "A count of website lead outcomes credited by the Meta pixel within the reporting window." ;
    skos:hiddenLabel "offsite_conversion.fb_pixel_lead" .

:onFacebookLeadOutcome
    a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader :allLeadsOutcome ;
    rdfs:label "On-Facebook lead" ;
    rdfs:comment "A lead Meta reports under its grouped type for all On-Facebook leads." ;
    skos:definition "A count of On-Facebook lead outcomes within the reporting window." ;
    skos:hiddenLabel "onsite_conversion.lead_grouped" .

:allAddToCartOutcome
    a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader adm:conversions ;
    rdfs:label "all adds to cart" ;
    rdfs:comment "Meta's grouped add-to-cart type, listed among Meta's grouped action types as Adds to Cart. The website and mobile-app add-to-cart kinds of this profile are narrower than it; its count and theirs cover overlapping outcomes and are not summed together." ;
    skos:definition "A count of the add-to-cart outcomes Meta reports under its grouped add-to-cart type within the reporting window." ;
    skos:hiddenLabel "omni_add_to_cart" .

:addToCartOutcome
    a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader :allAddToCartOutcome ;
    rdfs:label "website add to cart" ;
    rdfs:comment "An add-to-cart on the advertiser's website, credited by the Meta pixel." ;
    skos:definition "A count of website add-to-cart outcomes credited by the Meta pixel within the reporting window." ;
    skos:hiddenLabel "offsite_conversion.fb_pixel_add_to_cart" .

:mobileAppAddToCartOutcome
    a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader :allAddToCartOutcome ;
    rdfs:label "mobile app add to cart" ;
    rdfs:comment "An add-to-cart in the advertiser's mobile app, reported under Meta's Mobile App Adds To Cart type." ;
    skos:definition "A count of mobile-app add-to-cart outcomes within the reporting window." ;
    skos:hiddenLabel "app_custom_event.fb_mobile_add_to_cart" .


# --- Link clicks -------------------------------------------------------------
#
# Meta reports link clicks, the cost of a link click and the link click-through
# rate as fields of an insights row. Meta's clicks field counts clicks (all),
# which include the link clicks, so the link-click count is related to the
# shared clicks kind and not narrower than it, and a total over adm:clicks and
# its narrower kinds counts each Meta click once. The cost and the rate relate
# spend or impressions to link clicks rather than to clicks (all), and neither
# has a broader shared kind. Each kind carries, as its hidden label, the
# Insights field name the Meta mapping reads it by. No kind carries the
# link_click action type, whose entry in the actions list stays provider-local.

:linkClickOutcome
    a adm:MetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:related adm:clicks ;
    rdfs:label "link click" ;
    rdfs:comment "A click on the ad's destination link, one of the clicks the total click count includes beside interactions with the ad itself. Meta reports it in an insights row's inline_link_clicks field, the clicks on links to select destinations or experiences, on or off Facebook-owned properties, which use a fixed one-day-click attribution window. Related to the shared clicks kind and not narrower than it: Meta's clicks (all) already counts every link click, so a total over adm:clicks and its narrower kinds would count each link click twice. Its count and the clicks (all) count cover overlapping clicks and are not summed together." ;
    skos:definition "A count of destination-link clicks within the reporting window." ;
    skos:hiddenLabel "inline_link_clicks" .

:costPerLinkClick
    a adm:MetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    adm:rateDenominatorMetric :linkClickOutcome ;
    rdfs:label "cost per link click" ;
    rdfs:comment "Spend divided by link clicks, in the account currency, which Meta reports in an insights row's cost_per_inline_link_click field as the average cost of each inline link click. Derived and not additive. It has no broader shared kind: the shared cost per click divides spend by clicks (all), a different denominator, so a rollup through skos:broader would mix figures per link click with figures per click of any kind." ;
    skos:definition "A ratio of spend to link clicks over the reporting window." ;
    skos:hiddenLabel "cost_per_inline_link_click" .

:linkClickThroughRate
    a adm:MetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    adm:rateDenominatorMetric adm:impressions ;
    rdfs:label "link click-through rate" ;
    rdfs:comment "Link clicks divided by impressions, which Meta reports in an insights row's inline_link_click_ctr field as the percentage of times people saw the ad and performed an inline link click. The canonical value is a fraction of one, not percentage points: a reported 6.608 is recorded as 0.06608. Derived and not additive. It has no broader shared kind: the shared click-through rate divides clicks (all) by impressions, so a rollup through skos:broader would mix rates of link clicks with rates of clicks of any kind." ;
    skos:definition "A ratio of link clicks to impressions over the reporting window; a provider value of 6.608 percent is recorded canonically as 0.06608." ;
    skos:hiddenLabel "inline_link_click_ctr" .


# --- Purchase values ---------------------------------------------------------
#
# Meta returns the conversion value of each action type in the action_values
# list of an insights row, keyed by action type and attribution window like the
# counts in its actions list. Meta defines purchase ROAS as purchase conversion
# value divided by amount spent, and spend is in the account currency's major
# unit; each value is an amount in that unit. The four purchase types each
# have a value kind here: the grouped kind is narrower than adm:conversionValue,
# and each channel kind is narrower than the grouped kind. A grouped value and
# its narrower values cover overlapping purchases and are not summed together.

:allPurchasesValue
    a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader adm:conversionValue ;
    rdfs:label "all purchases conversion value" ;
    rdfs:comment "The conversion value of Meta's grouped purchase type, read from the omni_purchase entry of an insights row's action values. The website, On-Facebook and mobile-app purchase value kinds of this profile are narrower than it; its value and theirs cover overlapping purchases and are not summed together." ;
    skos:definition "The monetary value, in the account currency, of the purchase outcomes Meta reports under its grouped purchase type within the reporting window." .

:purchaseValue
    a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader :allPurchasesValue ;
    rdfs:label "website purchase conversion value" ;
    rdfs:comment "The conversion value of purchases on the advertiser's website, credited by the Meta pixel, read from the offsite_conversion.fb_pixel_purchase entry of an insights row's action values." ;
    skos:definition "The monetary value, in the account currency, of website purchase outcomes credited by the Meta pixel within the reporting window." .

:onFacebookPurchaseValue
    a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader :allPurchasesValue ;
    rdfs:label "On-Facebook purchase conversion value" ;
    rdfs:comment "The conversion value of purchases Meta reports under its On-Facebook Purchases type, read from the onsite_conversion.purchase entry of an insights row's action values." ;
    skos:definition "The monetary value, in the account currency, of On-Facebook purchase outcomes within the reporting window." .

:mobileAppPurchaseValue
    a adm:AttributedMetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader :allPurchasesValue ;
    rdfs:label "mobile app purchase conversion value" ;
    rdfs:comment "The conversion value of purchases in the advertiser's mobile app, read from the app_custom_event.fb_mobile_purchase entry of an insights row's action values." ;
    skos:definition "The monetary value, in the account currency, of mobile-app purchase outcomes within the reporting window." .


# --- Video metrics -----------------------------------------------------------
#
# Meta lists each Ads Manager video metric beside the Insights field that
# returns it, read for the action type video_view. 3-second video plays is the
# video_view entry of an insights row's actions list, and each other metric is
# the video_view entry of a video field of its own. 3-second video plays is
# narrower than the shared video view. The other kinds count other thresholds
# of the same plays and link to no shared metric kind. Each kind carries, as
# its hidden label, the token the Meta mapping reads it by: the action type for
# 3-second video plays and the Insights field name for the others.

:threeSecondVideoPlays
    a adm:MetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    skos:broader adm:videoView ;
    rdfs:label "3-second video plays" ;
    rdfs:comment "Meta's 3-second video plays, read from the video_view entry of an insights row's actions list. Of the Meta video kinds, it is the one narrower than the shared video view; the others count other thresholds of the same plays." ;
    skos:definition "A count of the 3-second video plays Meta reports within the reporting window." ;
    skos:hiddenLabel "video_view" .

:videoPlays
    a adm:MetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    rdfs:label "Video plays" ;
    rdfs:comment "Meta's video plays, read from the video_view entry of an insights row's video_play_actions field. Not narrower than the shared video view, which counts Meta's 3-second video plays." ;
    skos:definition "A count of the video plays Meta reports within the reporting window." ;
    skos:hiddenLabel "video_play_actions" .

:twoSecondContinuousVideoPlays
    a adm:MetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    rdfs:label "2-second continuous video plays" ;
    rdfs:comment "Meta's 2-second continuous video plays, read from the video_view entry of an insights row's video_continuous_2_sec_watched_actions field. Not narrower than the shared video view, which counts Meta's 3-second video plays." ;
    skos:definition "A count of the 2-second continuous video plays Meta reports within the reporting window." ;
    skos:hiddenLabel "video_continuous_2_sec_watched_actions" .

:thruPlays
    a adm:MetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    rdfs:label "ThruPlays" ;
    rdfs:comment "Meta's ThruPlays, read from the video_view entry of an insights row's video_thruplay_watched_actions field. Not narrower than the shared video view, which counts Meta's 3-second video plays." ;
    skos:definition "A count of the ThruPlays Meta reports within the reporting window." ;
    skos:hiddenLabel "video_thruplay_watched_actions" .

:videoPlaysAt25Percent
    a adm:MetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    rdfs:label "Video plays at 25%" ;
    rdfs:comment "Meta's video plays at 25%, read from the video_view entry of an insights row's video_p25_watched_actions field. Not narrower than the shared video view, which counts Meta's 3-second video plays." ;
    skos:definition "A count of the video plays Meta reports as reaching 25% of the video within the reporting window." ;
    skos:hiddenLabel "video_p25_watched_actions" .

:videoPlaysAt50Percent
    a adm:MetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    rdfs:label "Video plays at 50%" ;
    rdfs:comment "Meta's video plays at 50%, read from the video_view entry of an insights row's video_p50_watched_actions field. Not narrower than the shared video view, which counts Meta's 3-second video plays." ;
    skos:definition "A count of the video plays Meta reports as reaching 50% of the video within the reporting window." ;
    skos:hiddenLabel "video_p50_watched_actions" .

:videoPlaysAt75Percent
    a adm:MetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    rdfs:label "Video plays at 75%" ;
    rdfs:comment "Meta's video plays at 75%, read from the video_view entry of an insights row's video_p75_watched_actions field. Not narrower than the shared video view, which counts Meta's 3-second video plays." ;
    skos:definition "A count of the video plays Meta reports as reaching 75% of the video within the reporting window." ;
    skos:hiddenLabel "video_p75_watched_actions" .

:videoPlaysAt95Percent
    a adm:MetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    rdfs:label "Video plays at 95%" ;
    rdfs:comment "Meta's video plays at 95%, read from the video_view entry of an insights row's video_p95_watched_actions field. Not narrower than the shared video view, which counts Meta's 3-second video plays." ;
    skos:definition "A count of the video plays Meta reports as reaching 95% of the video within the reporting window." ;
    skos:hiddenLabel "video_p95_watched_actions" .

:videoPlaysAt100Percent
    a adm:MetricKind, skos:Concept ;
    skos:inScheme adm:MetricKindScheme ;
    rdfs:label "Video plays at 100%" ;
    rdfs:comment "Meta's video plays at 100%, read from the video_view entry of an insights row's video_p100_watched_actions field. Not narrower than the shared video view, which counts Meta's 3-second video plays." ;
    skos:definition "A count of the video plays Meta reports as reaching 100% of the video within the reporting window." ;
    skos:hiddenLabel "video_p100_watched_actions" .


# --- Delivery state ----------------------------------------------------------
#
# The twelve-value status Meta reports collapses four questions. Each value
# below states which answers it carries, so a lowering produces an intent, a
# serving state, a lifecycle standing, and zero or more holds rather than one
# opaque token.
#
# Three of the twelve carry no delivery information at all and are lifecycle
# answers only; two name an ancestor without identifying it, which is the
# absence the shared model requires a lowering to resolve by walking the
# hierarchy it already holds.

:accountBillingHold
    a adel:HoldKind, skos:Concept ;
    skos:inScheme adel:HoldKindScheme ;
    skos:broader adel:billingHold ;
    rdfs:label "account billing incomplete" ;
    rdfs:comment "Meta reports this on the entity, though it originates on the advertiser account. A lowering sets the originating resource to the account, not the entity." ;
    skos:hiddenLabel "PENDING_BILLING_INFO" .

:awaitingReviewHold
    a adel:HoldKind, skos:Concept ;
    skos:inScheme adel:HoldKindScheme ;
    skos:broader adel:policyReviewHold ;
    rdfs:label "awaiting policy review" ;
    rdfs:comment "Review has not concluded. Distinct from a rejection: nothing is wrong yet, and no advertiser action helps." ;
    skos:hiddenLabel "PENDING_REVIEW" .

:rejectedHold
    a adel:HoldKind, skos:Concept ;
    skos:inScheme adel:HoldKindScheme ;
    skos:broader adel:policyReviewHold ;
    rdfs:label "rejected under policy" ;
    rdfs:comment "Review concluded against the entity. The advertiser can amend or appeal, which is the opposite disposition from awaiting review." ;
    skos:hiddenLabel "DISAPPROVED" .

:platformProcessingHold
    a adel:HoldKind, skos:Concept ;
    skos:inScheme adel:HoldKindScheme ;
    skos:broader adel:processingHold ;
    rdfs:label "platform processing" ;
    rdfs:comment "Transient work following a recent change." ;
    skos:hiddenLabel "IN_PROCESS" .

:unspecifiedIssueHold
    a adel:HoldKind, skos:Concept ;
    skos:inScheme adel:HoldKindScheme ;
    skos:broader adel:unclassifiedHold ;
    rdfs:label "unspecified issue" ;
    rdfs:comment "Meta signals a problem without naming it. It falls under the shared unclassified hold and under no more specific kind: guessing which one would route the hold to the wrong owner." ;
    skos:hiddenLabel "WITH_ISSUES" .

:parentCampaignHold
    a adel:HoldKind, skos:Concept ;
    skos:inScheme adel:HoldKindScheme ;
    skos:broader adel:ancestorHeldHold ;
    rdfs:label "parent campaign not delivering" ;
    rdfs:comment "The wire value names the tier but not the entity. A lowering resolves the campaign from the hierarchy and sets it as the originating resource, which is the whole point of the shared model." ;
    skos:hiddenLabel "CAMPAIGN_PAUSED" .

:parentAdSetHold
    a adel:HoldKind, skos:Concept ;
    skos:inScheme adel:HoldKindScheme ;
    skos:broader adel:ancestorHeldHold ;
    rdfs:label "parent ad set not delivering" ;
    rdfs:comment "As with the campaign case, the tier is named and the entity is not." ;
    skos:hiddenLabel "ADSET_PAUSED" .

# An ad account reports its standing as an account_status code. Meta runs ads,
# or reviews them, under codes 1 ACTIVE, 8 PENDING_SETTLEMENT and 9
# IN_GRACE_PERIOD. The three hold kinds below name the codes under which a live
# account's ads cannot run, each carrying its code as skos:notation, and each
# originating on the account itself. Codes 100 and 101 close the account and
# carry no hold.

:disabledAccountHold
    a adel:HoldKind, skos:Concept ;
    skos:inScheme adel:HoldKindScheme ;
    skos:broader adel:accountRestrictionHold ;
    rdfs:label "ad account disabled" ;
    rdfs:comment "Meta's account_status 2, DISABLED: Meta has disabled the ad account, and none of its ads can run or be in review, since Meta runs ads under account status 1, 8 or 9. The account's disable_reason names a cause, from an ads integrity policy to a compromised account, without defining it; the Meta mapping does not read it, so the hold stays the shared account restriction." ;
    skos:notation "2" .

:unsettledAccountHold
    a adel:HoldKind, skos:Concept ;
    skos:inScheme adel:HoldKindScheme ;
    skos:broader adel:billingHold ;
    rdfs:label "ad account balance unsettled" ;
    rdfs:comment "Meta's account_status 3, UNSETTLED: the ad account's balance is not settled, and none of its ads can run or be in review, since Meta runs ads under account status 1, 8 or 9. A billing hold on the account's own state, apart from the PENDING_BILLING_INFO hold an ad reports, which originates on the same account and belongs to the ad's state." ;
    skos:notation "3" .

:accountRiskReviewHold
    a adel:HoldKind, skos:Concept ;
    skos:inScheme adel:HoldKindScheme ;
    skos:broader adel:policyReviewHold ;
    rdfs:label "ad account pending risk review" ;
    rdfs:comment "Meta's account_status 7, PENDING_RISK_REVIEW: the ad account awaits a risk review by Meta, and none of its ads can run or be in review until the status changes, since Meta runs ads under account status 1, 8 or 9. A platform review of the account rather than of one entity's content." ;
    skos:notation "7" .


# --- Budget ------------------------------------------------------------------
#
# Meta sends daily and lifetime allowances as separate fields whose values are
# indistinguishable minor-unit strings, and a spend cap in the same shape. The
# field a value arrived in is the only thing carrying its period. The daily
# field's period is the weekly-averaged daily period declared here, which is
# close to the shared daily period and not equal to it. An ad account's spend
# cap counts over the since-cap-reset period declared here, which is close to
# the shared lifetime period and not equal to it.

:weeklyAveragedDailyPeriod
    a abg:BudgetPeriod, skos:Concept ;
    skos:inScheme abg:BudgetPeriodScheme ;
    skos:closeMatch abg:dailyPeriod ;
    rdfs:label "daily, averaged over the week" ;
    rdfs:comment "The period of a Meta daily budget. Meta's v24.0 changelog states the rule, which applies from v24.0: the daily budget is an average over a calendar week running Sunday to Saturday, a day may spend up to 75 percent more than the daily budget, and the week spends at most seven times the daily budget. Close to the shared daily period, whose amount is allowed each day and resets at the provider's day boundary, and not the same: one day's spend can exceed the amount." ;
    skos:definition "A per-day allowance averaged over a Sunday-to-Saturday calendar week, with one day's spend up to 1.75 times the allowance and the week's spend at most seven times it." .

:dailyBudgetField
    a abg:BudgetPeriod, skos:Concept ;
    skos:inScheme abg:BudgetPeriodScheme ;
    skos:exactMatch :weeklyAveragedDailyPeriod ;
    rdfs:label "daily" ;
    rdfs:comment "Carried by the field name rather than by any value on the wire. Meta spends a daily budget as an allowance averaged over the week." ;
    skos:hiddenLabel "daily_budget" .

:lifetimeBudgetField
    a abg:BudgetPeriod, skos:Concept ;
    skos:inScheme abg:BudgetPeriodScheme ;
    skos:exactMatch abg:lifetimePeriod ;
    rdfs:label "lifetime" ;
    rdfs:comment "Carried by the field name. Identical in shape to the daily allowance, which is why the two are so readily compared in error." ;
    skos:hiddenLabel "lifetime_budget" .

:sinceCapResetPeriod
    a abg:BudgetPeriod, skos:Concept ;
    skos:inScheme abg:BudgetPeriodScheme ;
    skos:closeMatch abg:lifetimePeriod ;
    rdfs:label "since the cap was set or reset" ;
    rdfs:comment "The period of a Meta ad account spend cap. The cap counts the account's spend from the time it was last set or reset, and Meta compares the account's amount_spent against it: a new cap applies to spend after the time it is set, and resetting the cap sets amount_spent back to 0. Close to the shared lifetime period, an amount allowed once across the whole flight that does not reset, and not the same: an account has no flight, and the span the cap counts starts again each time the cap is set or reset." ;
    skos:definition "A single allowance counted from the last time the cap was set or reset, with no recurrence and no fixed end." .


# --- Bid strategies ----------------------------------------------------------
#
# Meta's campaign bid_strategy names one of four strategies. Each concept
# carries Meta's token as skos:hiddenLabel and sits beneath the shared strategy
# it is a kind of. A bid cap limits each bid and states no target for the
# average cost or the return, so it maximises outcomes beside the uncapped
# strategy; a cost cap is a target for the average cost of a result; a minimum
# return on ad spend is a target for the return.

:highestVolumeStrategy
    a aent:BidStrategy, skos:Concept ;
    skos:inScheme aent:BidStrategyScheme ;
    skos:broader aent:maximiseOutcomesStrategy ;
    rdfs:label "highest volume" ;
    rdfs:comment "Meta's LOWEST_COST_WITHOUT_CAP. Meta bids on the advertiser's behalf for the lowest-cost results, raising its effective bid as far as the results the optimization goal names call for, with no limit on the bid and no cost or return target. Ads Manager names it Highest Value when the optimization goal is value." ;
    skos:hiddenLabel "LOWEST_COST_WITHOUT_CAP" .

:bidCapStrategy
    a aent:BidStrategy, skos:Concept ;
    skos:inScheme aent:BidStrategyScheme ;
    skos:broader aent:maximiseOutcomesStrategy ;
    rdfs:label "bid cap" ;
    rdfs:comment "Meta's LOWEST_COST_WITH_BID_CAP, which Meta also calls manual bidding. Meta bids for the lowest-cost results and raises its bid as the results call for, never past the cap the ad set's bid_amount sets. The cap limits each bid in the auction and states no target for the average cost, so the strategy maximises outcomes under the cap." ;
    skos:hiddenLabel "LOWEST_COST_WITH_BID_CAP" .

:costPerResultGoalStrategy
    a aent:BidStrategy, skos:Concept ;
    skos:inScheme aent:BidStrategyScheme ;
    skos:broader aent:costTargetStrategy ;
    rdfs:label "cost per result goal" ;
    rdfs:comment "Meta's COST_CAP. Meta gets the most results it can while it strives to hold the average cost per result to the figure the ad set's bid_amount sets, a cost per conversion or install; Meta does not guarantee that the cost holds. The figure is a target for the average cost of a result rather than a limit on each bid." ;
    skos:hiddenLabel "COST_CAP" .

:roasGoalStrategy
    a aent:BidStrategy, skos:Concept ;
    skos:inScheme aent:BidStrategyScheme ;
    skos:broader aent:valueTargetStrategy ;
    rdfs:label "ROAS goal" ;
    rdfs:comment "Meta's LOWEST_COST_WITH_MIN_ROAS, a bidding option for value optimization. The ad set states the minimum return wanted from ad spend, total purchase conversion value divided by spend, in the roas_average_floor of its bid_constraints and sets no bid_amount. Meta scales that floor up 10,000 times, so a floor of 15000 is a return of 1.5." ;
    skos:hiddenLabel "LOWEST_COST_WITH_MIN_ROAS" .


# --- Connector row fields ----------------------------------------------------
#
# A property a connector wrote on a Meta insights row to name its breakdowns in
# one string. Meta returns each breakdown as a column of the row instead, and
# the property is deprecated.

:breakdown
    a rdf:Property ;
    owl:deprecated true ;
    rdfs:label "breakdown" ;
    rdfs:comment "Deprecated. Named the partitioning of a Meta insights row as one string of breakdown names and values, such as \"publisher_platform|platform_position: instagram|instagram_stories\". Meta sends no such string: it returns each breakdown as a column of the row, such as publisher_platform and platform_position. The Meta mapping reads those columns, and a row carrying this property yields no observation." ;
    rdfs:range xsd:string .
