creative-x-ferrero/mappings.json
DJP b20119b383 Add complete mapping system and automated Box.com monitoring service
Major Features:
- Complete Ferrero ↔ CreativeX mapping system with 93 brands
- Automated Box.com folder monitoring service
- Email notifications with score breakdowns
- Database integration for result storage

Mapping System (v2.0.0):
- mappings.json: 93 brand mappings, 44+ channel mappings
- core/mapping_resolver.py: Translates Ferrero codes to CreativeX format
- scripts/validate_mappings.py: Validation tool for brand/channel support
- scripts/generate_brand_mappings.py: Auto-mapping tool
- scripts/download_reports.py: Scorecard PDF download tool
- Updated scripts/upload.py: Integrated mapping validation
- Updated scripts/check_status.py: Added detailed score display with guidelines

Documentation:
- Updated README.md: Complete user guide with mapping system
- Updated STATUS.md: Production-ready status with test results
- MAPPINGS_GUIDE.md: Complete mapping documentation
- MAPPING_IMPLEMENTATION.md: Implementation summary
- BRAND_MAPPINGS_REVIEW.md: Brand mapping validation guide
- PRODUCTION_BRANDS_SUMMARY.md: Production brand catalog
- PRODUCTION_MAPPING_COMPLETE.md: Mapping completion summary

Automation Service (New):
- creativex-automation/: Complete automated Box monitoring service
- Monitors Box Ferrero-In folder (363284027140) for new files
- Automatically uploads to CreativeX
- Polls for completion (30 min intervals)
- Extracts scores and stores in PostgreSQL creativex_scores table
- Sends formatted emails to file uploader + daveporter@oliver.agency
- Moves processed files to Processed subfolder

Service Components:
- automation/box_monitor.py: Box folder monitoring with uploader detection
- automation/upload_processor.py: CreativeX upload integration
- automation/status_poller.py: CreativeX status polling
- automation/result_handler.py: Score extraction and email sending
- automation/orchestrator.py: Service coordination
- automation/processing_queue.py: JSON-based processing queue
- service.py: Main service entry point
- config.py: Service configuration loader
- requirements.txt: All dependencies
- deployment/systemd/: Systemd service unit file
- Updated shared/notifier.py: Added creativex_upload_complete and creativex_upload_failed templates

Testing:
- Supports --dry-run mode for configuration testing
- Supports --scan-once mode for Box folder testing
- Manual run mode for development/testing
- Comprehensive logging with rotation (10MB, 28 backups)

Database Integration:
- Uses existing creativex_scores table (no migrations needed)
- Compatible with existing Ferrero-Opentext workflows
- Stores full CreativeX API responses in JSONB

Email Templates:
- Matches Ferrero-Opentext styling (#9c27b0 purple for CreativeX)
- Includes score, tier, guidelines breakdown, scorecard URL
- Recipients: Box uploader + CC to daveporter@oliver.agency

Deployment:
- Runs locally for dev/testing
- Systemd service for production
- Auto-restart on failure
- Complete documentation in creativex-automation/README.md

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
2026-01-29 09:51:16 -05:00

928 lines
No EOL
27 KiB
JSON

{
"_comment": "Mapping tables between Ferrero naming conventions and Creative X API",
"_last_updated": "2026-01-22",
"brand_mappings": {
"MC": {
"creativex_name": "Mon Chéri",
"creativex_id": 13422,
"ferrero_name": "MON CHERI"
},
"PK": {
"creativex_name": "Pocket Coffee",
"creativex_id": 13420,
"ferrero_name": "POCKET COFFEE"
},
"ROC": {
"creativex_name": "Ferrero Rocher",
"creativex_id": 13415,
"ferrero_name": "ROCHER"
},
"FPR": {
"creativex_name": "Ferrero Prestige",
"creativex_id": 18679,
"ferrero_name": "FERRERO PRESTIGE"
},
"KMAX": {
"creativex_name": "Kinder Maxi",
"creativex_id": 11366,
"ferrero_name": "KINDER MAXI"
},
"KSB": {
"creativex_name": "Kinder Schoko Bons",
"creativex_id": 10758,
"ferrero_name": "SCHOKOBONS"
},
"KCH": {
"creativex_name": "Kinder Chocolate",
"creativex_id": 10435,
"ferrero_name": "KINDER CHOCOLATE"
},
"RAF": {
"creativex_name": "Raffaello",
"creativex_id": 13416,
"ferrero_name": "RAFFAELLO"
},
"DUN": {
"creativex_name": "Kinder Duplo",
"creativex_id": 11691,
"ferrero_name": "DUPLO NOCCIOLATO"
},
"TRO": {
"creativex_name": "Kinder Tronky",
"creativex_id": 11367,
"ferrero_name": "TRONKY"
},
"KCY": {
"creativex_name": "Kinder Country",
"creativex_id": 11372,
"ferrero_name": "KINDER COUNTRY"
},
"BUE": {
"creativex_name": "Kinder Bueno",
"creativex_id": 10432,
"ferrero_name": "KINDER BUENO"
},
"KSUR": {
"creativex_name": "Kinder Surprise",
"creativex_id": 10434,
"ferrero_name": "KINDER SURPRISE"
},
"KMS": {
"creativex_name": "Kinder Surprise Maxi",
"creativex_id": 11386,
"ferrero_name": "KINDER MAXI SURPRISE"
},
"KPI": {
"creativex_name": "Kinder Pingui",
"creativex_id": 10440,
"ferrero_name": "KINDER PINGUI"
},
"NUT": {
"creativex_name": "Nutella",
"creativex_id": 13411,
"ferrero_name": "NUTELLA"
},
"NUGO": {
"creativex_name": "Nutella & Go",
"creativex_id": 13412,
"ferrero_name": "NUTELLA & GO"
},
"FFIE": {
"creativex_name": "Fiesta",
"creativex_id": 11438,
"ferrero_name": "FERRERO FIESTA"
},
"KBRI": {
"creativex_name": "Kinder Brioss",
"creativex_id": 11373,
"ferrero_name": "KINDER BRIOSS"
},
"FBRI": {
"creativex_name": "Ferrero Rocher",
"creativex_id": 13415,
"ferrero_name": "FERRERO BRIOSS"
},
"KFL": {
"creativex_name": "Kinder Milk Slice",
"creativex_id": 11368,
"ferrero_name": "KINDER MILK SLICE"
},
"KCOL": {
"creativex_name": "Kinder Colazione Più",
"creativex_id": 11374,
"ferrero_name": "KINDER COLAZIONE PIU"
},
"KDEL": {
"creativex_name": "Kinder Delice",
"creativex_id": 11363,
"ferrero_name": "KINDER DELICE"
},
"KCHO": {
"creativex_name": "Kinder Choco Fresh",
"creativex_id": 10437,
"ferrero_name": "KINDER CHOCOFRESH"
},
"KHH": {
"creativex_name": "Kinder Happy Hippo",
"creativex_id": 11364,
"ferrero_name": "KINDER HAPPY HIPPO"
},
"TT": {
"creativex_name": "Tic Tac",
"creativex_id": 13425,
"ferrero_name": "TIC TAC"
},
"ET": {
"creativex_name": "Estathe",
"creativex_id": 17838,
"ferrero_name": "ESTATHE"
},
"DEL": {
"creativex_name": "Delacre",
"creativex_id": 17477,
"ferrero_name": "DELACRE"
},
"KUS": {
"creativex_name": "Ferrero Kusschen",
"creativex_id": 13421,
"ferrero_name": "KUSSCHEN"
},
"KPAR": {
"creativex_name": "Kinder Paradiso",
"creativex_id": 11371,
"ferrero_name": "KINDER PARADISO"
},
"KMKNG": {
"creativex_name": "Kinder Maxi King",
"creativex_id": 10438,
"ferrero_name": "KINDER MAXI KING"
},
"HAN": {
"creativex_name": "Hanuta",
"creativex_id": 18514,
"ferrero_name": "HANUTA"
},
"GIO": {
"creativex_name": "Giotto",
"creativex_id": 13419,
"ferrero_name": "GIOTTO"
},
"KJOY": {
"creativex_name": "Kinder Joy",
"creativex_id": 10433,
"ferrero_name": "KINDER MERENDERO/JOY"
},
"KPC": {
"creativex_name": "Kinder Pan e Cioc",
"creativex_id": 11375,
"ferrero_name": "KINDER PAN E CIOC"
},
"YOG": {
"creativex_name": "Yogurette",
"creativex_id": 13193,
"ferrero_name": "YOGURETTE"
},
"DU": {
"creativex_name": "Kinder Duplo",
"creativex_id": 11691,
"ferrero_name": "DUPLO"
},
"KSBCR": {
"creativex_name": "Kinder Crispy",
"creativex_id": 18231,
"ferrero_name": "KINDER SCHOKOBONS CRISPY"
},
"KMIX": {
"creativex_name": "Kinder Mix",
"creativex_id": 11384,
"ferrero_name": "KINDER MIX"
},
"TTCHE": {
"creativex_name": "Tic Tac Chewy",
"creativex_id": 13426,
"ferrero_name": "TIC TAC CHEWY"
},
"100GR": {
"creativex_name": "100 Grand Ice Cream",
"creativex_id": 20079,
"ferrero_name": "100 GRAND"
},
"BRUTH": {
"creativex_name": "Baby Ruth Ice Cream",
"creativex_id": 20078,
"ferrero_name": "BABY RUTH"
},
"BTF": {
"creativex_name": "Butterfinger",
"creativex_id": 19368,
"ferrero_name": "BUTTERFINGER"
},
"CRU": {
"creativex_name": "Crunch",
"creativex_id": 19369,
"ferrero_name": "CRUNCH"
},
"KPLUM": {
"creativex_name": "Kinder PlumCake",
"creativex_id": 11376,
"ferrero_name": "KINDER PLUMCAKE"
},
"TTJEL": {
"creativex_name": "Tic Tac Chewy",
"creativex_id": 13426,
"ferrero_name": "TIC TAC JELLY"
},
"KCHIC": {
"creativex_name": "Kinder Chocolate Ice Cream",
"creativex_id": 11683,
"ferrero_name": "KINDER CHOCOLATE ICE CREAM"
},
"BUEIC": {
"creativex_name": "Kinder Bueno Ice Cream",
"creativex_id": 11370,
"ferrero_name": "KINDER BUENO ICE CREAM"
},
"ROIC": {
"creativex_name": "Ferrero Rocher Ice Cream",
"creativex_id": 13256,
"ferrero_name": "FERRERO ROCHER ICE CREAM"
},
"RAFIC": {
"creativex_name": "Raffaello Ice Cream",
"creativex_id": 13257,
"ferrero_name": "RAFFAELLO ICE CREAM"
},
"ETIC": {
"creativex_name": "Estathè Ice",
"creativex_id": 13192,
"ferrero_name": "ESTATHE ICE"
},
"RDN": {
"creativex_name": "Rondnoir",
"creativex_id": 13423,
"ferrero_name": "RONDNOIR"
},
"TTSF": {
"creativex_name": "Tic Tac Fresh",
"creativex_id": 17482,
"ferrero_name": "TIC TAC CHILL/TIC TAC BREEZE"
},
"KCCK": {
"creativex_name": "Kinder Crunchy Cookie",
"creativex_id": 12652,
"ferrero_name": "KINDER CRUNCHY COOKIES"
},
"KDUO": {
"creativex_name": "Kinder Duo",
"creativex_id": 11369,
"ferrero_name": "KINDER DUO"
},
"KTRO": {
"creativex_name": "Kinder Tronky",
"creativex_id": 11367,
"ferrero_name": "KINDER TRONKY"
},
"FRO": {
"creativex_name": "Ferrero Rocher Moments",
"creativex_id": 19435,
"ferrero_name": "FERRERO ROCHER ORIGINS"
},
"KSURM": {
"creativex_name": "Kinder Surprise Maxi",
"creativex_id": 11386,
"ferrero_name": "KINDER SORPRESA MAXI"
},
"NUCOK": {
"creativex_name": "Nutella Crepes",
"creativex_id": 21760,
"ferrero_name": "NUTELLA COOKIES"
},
"RDNIC": {
"creativex_name": "Ferrero Rondnoir Ice Cream",
"creativex_id": 13190,
"ferrero_name": "RONDNOIR ICE CREAM"
},
"PKIC": {
"creativex_name": "Pocket Coffee Ice Cream",
"creativex_id": 13191,
"ferrero_name": "POCKET COFFEE ICE CREAM"
},
"YOGIC": {
"creativex_name": "Yogurette Ice Cream",
"creativex_id": 13427,
"ferrero_name": "YOGURETTE ICE CREAM"
},
"NUBR": {
"creativex_name": "Nutella B-ready",
"creativex_id": 13413,
"ferrero_name": "NUTELLA B-READY"
},
"TTTWO": {
"creativex_name": "Tic Tac Two",
"creativex_id": 18763,
"ferrero_name": "TIC TAC TWO"
},
"NUIC": {
"creativex_name": "Nutella Ice Cream",
"creativex_id": 11768,
"ferrero_name": "NUTELLA ICE CREAM"
},
"HANR": {
"creativex_name": "Hanuta Riegel",
"creativex_id": 13409,
"ferrero_name": "HANUTA RIEGEL"
},
"KCHH": {
"creativex_name": "Kinder Happy Hippo",
"creativex_id": 11364,
"ferrero_name": "KINDER CIOCCOLATO HAPPY"
},
"KTRIS": {
"creativex_name": "Kinder Trust",
"creativex_id": 18600,
"ferrero_name": "KINDER TRIS"
},
"NUCRE": {
"creativex_name": "Nutella Crepes",
"creativex_id": 21760,
"ferrero_name": "NUTELLA CREPES"
},
"NUDON": {
"creativex_name": "Nutella Donut",
"creativex_id": 18021,
"ferrero_name": "NUTELLA DONUT"
},
"GFRO": {
"creativex_name": "Ferrero Rocher",
"creativex_id": 13415,
"ferrero_name": "GRAND FERRERO ROCHER"
},
"TROSN": {
"creativex_name": "Kinder Tronky Sandwich",
"creativex_id": 13410,
"ferrero_name": "TRONKY SANDWICH"
},
"KCRO": {
"creativex_name": "Kinder Crispy",
"creativex_id": 18231,
"ferrero_name": "KINDER CROISSANT"
},
"NUCRO": {
"creativex_name": "Nutella Croissant",
"creativex_id": 17839,
"ferrero_name": "NUTELLA CROISSANT"
},
"RABIS": {
"creativex_name": "Nutella Biscuits",
"creativex_id": 13414,
"ferrero_name": "RAFFAELLO BISCUITS"
},
"KCYB": {
"creativex_name": "Kinder Country",
"creativex_id": 11372,
"ferrero_name": "KINDER COUNTRY BISCUIT"
},
"KCARD": {
"creativex_name": "Kinder Cards",
"creativex_id": 11361,
"ferrero_name": "KINDER CARDS"
},
"KHMO": {
"creativex_name": "Kinder Happy Moments",
"creativex_id": 11380,
"ferrero_name": "KINDER HAPPY MOMENTS"
},
"KKIND": {
"creativex_name": "Kinder Kinderini",
"creativex_id": 11379,
"ferrero_name": "KINDER KINDERINI"
},
"KKOR": {
"creativex_name": "Kinder Kornetti",
"creativex_id": 11377,
"ferrero_name": "KINDER KORNETTI"
},
"THO": {
"creativex_name": "Thorntons",
"creativex_id": 18599,
"ferrero_name": "THORNTONS"
},
"DDCH": {
"creativex_name": "DeliChoc",
"creativex_id": 17479,
"ferrero_name": "DELACRE DELICHOC"
},
"KCRE": {
"creativex_name": "Kinder Creamy",
"creativex_id": 11362,
"ferrero_name": "KINDER CREAMY"
},
"NUBIS": {
"creativex_name": "Nutella Biscuits",
"creativex_id": 13414,
"ferrero_name": "NUTELLA BISCUITS"
},
"ROMO": {
"creativex_name": "Ferrero Rocher Moments",
"creativex_id": 19435,
"ferrero_name": "FERRERO ROCHER MOMENTS"
},
"KCLA": {
"creativex_name": "Kinder Coeur au lait",
"creativex_id": 22075,
"ferrero_name": "KINDER COEUR AU LAIT"
},
"FULF": {
"creativex_name": "Fulfil",
"creativex_id": 12981,
"ferrero_name": "FF ENERGY BA"
},
"KFIG": {
"creativex_name": "Kinder Pingui",
"creativex_id": 10440,
"ferrero_name": "KINDER FIGURE"
},
"KCER": {
"creativex_name": "Kinder Cereale",
"creativex_id": 13428,
"ferrero_name": "KINDER CEREALE"
},
"FOX": {
"creativex_name": "Fox's Biscuits",
"creativex_id": 19424,
"ferrero_name": "FOX"
},
"EATN": {
"creativex_name": "Eat Natural",
"creativex_id": 12980,
"ferrero_name": "EAT NATURAL"
},
"FCIC": {
"creativex_name": "Ferrero Rocher Triple Experience Ice Cream",
"creativex_id": 13188,
"ferrero_name": "FERRERO COLLECTION EXPERIENCE ICE CREAM"
},
"RAFTE": {
"creativex_name": "Raffaello Triple Experience Ice Cream",
"creativex_id": 13189,
"ferrero_name": "RAFFAELLO TRIPLE EXPERIENCE ICE CREAM"
}
},
"channel_mappings": {
"_comment": "Maps Ferrero social media codes to Creative X channel + placement",
"_structure": "Each mapping includes: channel (required), publisher (optional), placement (optional)",
"FACEBOOK_CODES": {
"FBD": {
"ferrero_name": "FB - Biz Disco Feed",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "biz_disco_feed"
},
"FGF": {
"ferrero_name": "FB - Groups Feed",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "facebook_groups_feed"
},
"FBR": {
"ferrero_name": "FB - Reels",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "facebook_reels"
},
"FRO": {
"ferrero_name": "FB - Reels Overlay",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "facebook_reels_overlay"
},
"FBS": {
"ferrero_name": "FB - Stories",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "facebook_stories"
},
"FBF": {
"ferrero_name": "FB - Feed",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "feed"
},
"FIA": {
"ferrero_name": "FB - Instant Article",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "instant_article"
},
"FIV": {
"ferrero_name": "FB - Instream Video",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "instream_video"
},
"FMP": {
"ferrero_name": "FB - Marketplace",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "marketplace"
},
"FPF": {
"ferrero_name": "FB - Profile Feed",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "facebook_profile_feed"
},
"FRC": {
"ferrero_name": "FB - Right Hand Column",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "right_hand_column"
},
"FSE": {
"ferrero_name": "FB - Search",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "search"
},
"FSS": {
"ferrero_name": "FB - Search Serp",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "search_serp"
},
"FSV": {
"ferrero_name": "FB - Suggested Video",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "suggested_video"
},
"FUK": {
"ferrero_name": "FB - Unknown",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "unknown"
},
"FVF": {
"ferrero_name": "FB - Video Feeds",
"creativex_channel": "facebook_paid",
"creativex_publisher": "facebook",
"creativex_placement": "video_feeds"
}
},
"AUDIENCE_NETWORK_CODES": {
"ANC": {
"ferrero_name": "Audience Network - An Classic",
"creativex_channel": "facebook_paid",
"creativex_publisher": "audience_network",
"creativex_placement": "an_classic"
},
"ANI": {
"ferrero_name": "Audience Network - Instream Video",
"creativex_channel": "facebook_paid",
"creativex_publisher": "audience_network",
"creativex_placement": "instream_video"
},
"ANR": {
"ferrero_name": "Audience Network - Rewarded Video",
"creativex_channel": "facebook_paid",
"creativex_publisher": "audience_network",
"creativex_placement": "rewarded_video"
}
},
"MESSENGER_CODES": {
"MSI": {
"ferrero_name": "Messenger - Inbox",
"creativex_channel": "facebook_paid",
"creativex_publisher": "messenger",
"creativex_placement": "messenger_inbox"
},
"MSS": {
"ferrero_name": "Messenger - Stories",
"creativex_channel": "facebook_paid",
"creativex_publisher": "messenger",
"creativex_placement": "messenger_stories"
}
},
"INSTAGRAM_CODES": {
"IGF": {
"ferrero_name": "IG - Feed",
"creativex_channel": "instagram_paid",
"creativex_publisher": "instagram",
"creativex_placement": "feed"
},
"IGE": {
"ferrero_name": "IG - Explore",
"creativex_channel": "instagram_paid",
"creativex_publisher": "instagram",
"creativex_placement": "instagram_explore"
},
"IGG": {
"ferrero_name": "IG - Explore Grid Home",
"creativex_channel": "instagram_paid",
"creativex_publisher": "instagram",
"creativex_placement": "instagram_explore_grid_home"
},
"IGT": {
"ferrero_name": "IG - IGTV",
"creativex_channel": "instagram_paid",
"creativex_publisher": "instagram",
"creativex_placement": "instagram_igtv"
},
"IPF": {
"ferrero_name": "IG - Profile Feed",
"creativex_channel": "instagram_paid",
"creativex_publisher": "instagram",
"creativex_placement": "instagram_profile_feed"
},
"IPR": {
"ferrero_name": "IG - Profile Reels",
"creativex_channel": "instagram_paid",
"creativex_publisher": "instagram",
"creativex_placement": "instagram_profile_reels"
},
"IGR": {
"ferrero_name": "IG - Reels",
"creativex_channel": "instagram_paid",
"creativex_publisher": "instagram",
"creativex_placement": "instagram_reels"
},
"IGO": {
"ferrero_name": "IG - Overlay",
"creativex_channel": "instagram_paid",
"creativex_publisher": "instagram",
"creativex_placement": "instagram_reels_overlay"
},
"IGS": {
"ferrero_name": "IG - Search",
"creativex_channel": "instagram_paid",
"creativex_publisher": "instagram",
"creativex_placement": "instagram_search"
},
"ISH": {
"ferrero_name": "IG - Shop",
"creativex_channel": "instagram_paid",
"creativex_publisher": "instagram",
"creativex_placement": "instagram_shop"
},
"IST": {
"ferrero_name": "IG - Stories",
"creativex_channel": "instagram_paid",
"creativex_publisher": "instagram",
"creativex_placement": "instagram_stories"
}
},
"YOUTUBE_GOOGLE_ADS_CODES": {
"YTB": {
"ferrero_name": "YT - Youtube Bumper",
"creativex_channel": "google_ads",
"creativex_publisher": "youtube",
"creativex_ad_format": "Bumper"
},
"YTI": {
"ferrero_name": "YT - Youtube Instream",
"creativex_channel": "google_ads",
"creativex_publisher": "youtube",
"creativex_ad_format": "Skippable In-Stream",
"_note": "Could also be 'Non-Skippable In-Stream' - may need to determine based on duration"
},
"YTS": {
"ferrero_name": "YT - Youtube Shorts",
"creativex_channel": "google_ads",
"creativex_publisher": "youtube",
"creativex_ad_format": "Shorts"
},
"YTT": {
"ferrero_name": "YT - Youtube Trueview",
"creativex_channel": "google_ads",
"creativex_publisher": "youtube",
"creativex_ad_format": "In-Feed Video"
},
"YTA": {
"ferrero_name": "YT - Youtube Ad",
"creativex_channel": "google_ads",
"creativex_publisher": "youtube",
"creativex_ad_format": "Video Responsive Ad"
}
},
"DV360_CODES": {
"DV3": {
"ferrero_name": "DV360",
"creativex_channel": "dv360",
"creativex_publisher": "youtube",
"creativex_ad_format": "Skippable In-Stream",
"_note": "Default mapping - may need ad_format specified based on creative type"
}
},
"TIKTOK_CODES": {
"TIK": {
"ferrero_name": "TikTok",
"creativex_channel": "tiktok_paid"
}
},
"SNAPCHAT_CODES": {
"SNA": {
"ferrero_name": "Snap",
"creativex_channel": "snapchat_paid"
}
},
"PINTEREST_CODES": {
"PIN": {
"ferrero_name": "Pinterest",
"creativex_channel": "pinterest"
}
},
"TWITTER_CODES": {
"TWI": {
"ferrero_name": "Twitter",
"creativex_channel": "twitter_paid"
}
},
"AMAZON_CODES": {
"AMZ": {
"ferrero_name": "Amazon",
"creativex_channel": "amazon_paid"
}
},
"GOOGLE_CODES": {
"GOO": {
"ferrero_name": "Google",
"creativex_channel": "google_ads",
"_note": "Generic Google - may need to specify publisher/ad_format based on creative"
}
}
},
"country_mappings": {
"_comment": "Country codes mostly match ISO 3166-1, but noting exceptions",
"_note": "Most Ferrero country codes are standard ISO codes and map directly to Creative X markets",
"SPECIAL_CASES": {
"GL": {
"ferrero_name": "GLOBAL",
"creativex_name": "Global",
"creativex_iso_code": null,
"_note": "GL in Ferrero = Global, but GL is also Greenland in ISO. Creative X has both 'Global' (no code) and 'Greenland' (GL)"
},
"GB": {
"ferrero_name": "United Kingdom",
"creativex_name": "United Kingdom",
"creativex_iso_code": "GB",
"_note": "UK is sometimes used colloquially but GB is the official ISO code"
},
"US": {
"ferrero_name": "United States",
"creativex_name": "United States of America",
"creativex_iso_code": "US"
},
"KR": {
"ferrero_name": "South Korea",
"creativex_name": "South Korea",
"creativex_iso_code": "KR"
},
"TW": {
"ferrero_name": "Taiwan",
"creativex_name": "Taiwan, Province of China",
"creativex_iso_code": "TW"
},
"CZ": {
"ferrero_name": "Czech Republic",
"creativex_name": "Czechia",
"creativex_iso_code": "CZ"
},
"SZ": {
"ferrero_name": "Eswatini",
"creativex_name": "Eswatini",
"creativex_iso_code": "SZ",
"_note": "Formerly Swaziland"
},
"VA": {
"ferrero_name": "Vatican City",
"creativex_name": "Holy See",
"creativex_iso_code": "VA"
},
"CD": {
"ferrero_name": "Congo (DRC)",
"creativex_name": "Congo (Democratic Republic of the)",
"creativex_iso_code": "CD"
},
"CG": {
"ferrero_name": "Congo (Republic)",
"creativex_name": "Congo",
"creativex_iso_code": "CG"
},
"XK": {
"ferrero_name": "Kosovo",
"creativex_name": "Kosovo",
"creativex_iso_code": "XK",
"_note": "User-assigned code, not official ISO"
}
},
"VERIFICATION_NOTES": [
"Most countries map 1:1 via ISO 3166-1 alpha-2 codes",
"Creative X has 252 markets in their system",
"Ferrero data.json has 202 countries defined",
"The main issue is GL (GLOBAL vs Greenland) which needs context-based handling"
]
},
"reverse_lookups": {
"_comment": "Helper mappings for reverse lookups from Creative X to Ferrero",
"creativex_brand_to_ferrero": {
"Nutella": "NUT",
"Rafalleo": "RAF"
},
"creativex_channel_to_ferrero_codes": {
"facebook_paid": [
"FBD",
"FGF",
"FBR",
"FRO",
"FBS",
"FBF",
"FIA",
"FIV",
"FMP",
"FPF",
"FRC",
"FSE",
"FSS",
"FSV",
"FUK",
"FVF",
"ANC",
"ANI",
"ANR",
"MSI",
"MSS"
],
"instagram_paid": [
"IGF",
"IGE",
"IGG",
"IGT",
"IPF",
"IPR",
"IGR",
"IGO",
"IGS",
"ISH",
"IST"
],
"google_ads": [
"YTB",
"YTI",
"YTS",
"YTT",
"YTA",
"GOO"
],
"dv360": [
"DV3"
],
"tiktok_paid": [
"TIK"
],
"snapchat_paid": [
"SNA"
],
"pinterest": [
"PIN"
],
"twitter_paid": [
"TWI"
],
"amazon_paid": [
"AMZ"
]
}
},
"validation_rules": {
"_comment": "Rules for mapping and validation",
"brand_mapping": {
"rule": "If Ferrero brand code exists in brand_mappings, use creativex_name; otherwise upload will fail",
"missing_brands": "All Ferrero brands except NUT and RAF are not yet in Creative X system"
},
"channel_mapping": {
"rule": "Map Ferrero social media code to Creative X channel + optional publisher/placement",
"facebook_instagram_needs": "Requires channel, publisher, and placement",
"youtube_needs": "Requires channel, publisher, and ad_format",
"simple_channels": "tiktok_paid, snapchat_paid, pinterest, twitter_paid, amazon_paid only need channel"
},
"country_mapping": {
"rule": "Always use full market name (e.g., 'Germany' not 'DE'). API requires market_name field.",
"gl_handling": "If country_code == 'GL' in Ferrero, send market_name='Global'"
}
},
"upload_payload_structure": {
"_comment": "Reference for how to construct Creative X preflight payload using mappings",
"example": {
"brand_name": "<<from brand_mappings[ferrero_brand_code].creativex_name>>",
"market_name": "<<from ferrero country_name field (e.g., 'Germany', 'Italy', 'Global')>>",
"channel": "<<from channel_mappings[ferrero_social_code].creativex_channel>>",
"publisher": "<<from channel_mappings[ferrero_social_code].creativex_publisher (optional)>>",
"placement": "<<from channel_mappings[ferrero_social_code].creativex_placement (optional)>>",
"ad_format": "<<from channel_mappings[ferrero_social_code].creativex_ad_format (optional)>>",
"language": "<<from ferrero language_code, lowercase>>",
"dimensions": "<<from ferrero aspect_ratio, e.g., '16x9', '1x1'>>",
"duration": "<<from ferrero seconds, e.g., '6', '20'>>",
"subject": "<<from ferrero subject_title>>"
}
}
}