TIP: You can type at any time to perform a new search.

Security findings

Repository
OCA/social · module folder · Try on Runboat
Module version
1.0.0
Category
Social Network
Folder size
0.67 MB
License
AGPL-3
Application
No
Auto-installable
No
Website
https://github.com/OCA/social
Last tracking update
2026-10-08 03:00:02
Authors
Odoo Community Association (OCA), Binhex
Maintainers
Odoo Community Association (OCA), Binhex
Committers
OCA-git-bot, Edilio Escalona Almira
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
None
Description
This module plugs LinkedIn Ads into *Social Media Advertising*. Its lists
hang from a *LinkedIn* menu of their own, under *Advertising* and under
*Configuration* > Stages, so they never show the records of another social
media.

Main features:

- Campaign group and campaign management synchronized with LinkedIn Ads:
  create them in LinkedIn from Odoo (in draft state) or import the existing
  ones, and link posts to campaigns as sponsored creatives.
- The LinkedIn statuses of campaigns, campaign groups and ads (Draft,
  Active, Paused, Archived...) are declared as stages of *Social Media
  Advertising*, so the badges and the status bars show the real LinkedIn
  vocabulary.

Code Analysis info_outline

Views touched (7)
XML IDNameModelTypeStatus
social_account_view_form_advertising_account_inherit social.account.view.form.advertising.account.inherit.advertising.linkedin social.account form Inherits social_media_advertising.social_account_view_form_inherit
social_account_view_form_inherit social.account.view.form.inherit.advertising.linkedin social.account form Inherits social_media_advertising.social_account_view_form_inherit
social_advertising_ad_view_form_inherit social.advertising.ad.view.form.inherit.advertising.linkedin social.advertising.ad form Inherits social_media_advertising.social_advertising_ad_view_form
social_advertising_campaign_group_view_form_inherit social.advertising.campaign.group.view.form.inherit.advertising.linkedin social.advertising.campaign.group form Inherits social_media_advertising.social_advertising_campaign_group_view_form
social_advertising_campaign_group_view_tree_inherit social.advertising.campaign.group.view.tree.inherit.advertising.linkedin social.advertising.campaign.group tree Inherits social_media_advertising.social_advertising_campaign_group_view_tree
social_advertising_campaign_view_form_inherit social.advertising.campaign.view.form.inherit.advertising.linkedin social.advertising.campaign form Inherits social_media_advertising.social_advertising_campaign_view_form
social_advertising_campaign_view_tree_inherit social.advertising.campaign.view.tree.inherit.advertising.linkedin social.advertising.campaign tree Inherits social_media_advertising.social_advertising_campaign_view_tree
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (9)

New fields (1)
  • linkedin_missing_ads_scopes Char
    compute='_compute_linkedin_missing_ads_scopes' help='The Advertising API scopes the token of this account was not granted. A token keeps the scopes it was issued with, so an account associated before this module was installed has to be authorized again to reach the Ads API.'
Public methods (1)
  • action_import_campaigns(self)

New fields (4)
  • linkedin_reference Char
    help='Organization or person the advertising account advertises on behalf of.' readonly=True string='LinkedIn Owner'
  • linkedin_serving_status Char
    help='Why LinkedIn is serving the ads of this advertising account, or not: RUNNABLE when it is eligible, otherwise the reasons why it is not, such as BILLING_HOLD or ACCOUNT_TOTAL_BUDGET_HOLD.' readonly=True string='LinkedIn Serving Status'
  • linkedin_status Selection
    help='Status of the advertising account on LinkedIn.' readonly=True string='LinkedIn Status' args: [('DRAFT', 'Draft'), ('ACTIVE', 'Active'), ('CANCELED', 'Canceled'), ('PENDING_DELETION', 'Pending deletion'), ('REMOVED', 'Removed')]
  • linkedin_type Selection
    help='Enterprise advertising accounts are created by LinkedIn itself and cannot be test accounts.' readonly=True string='LinkedIn Type' args: [('BUSINESS', 'Business'), ('ENTERPRISE', 'Enterprise')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (9)
  • currency_id Many2one → res.currency
    related='campaign_group_id.currency_id' args: 'res.currency'
  • daily_budget Monetary
    help='Maximum amount to spend on this campaign per day. The campaign group total budget limits the overall spending.' tracking=True
  • linkedin_format Selection
    copy=False default='STANDARD_UPDATE' help="Ad format of the campaign on LinkedIn. A campaign only accepts posts of its format, and LinkedIn does not allow changing it once the campaign is created, so a post with a video needs a campaign of the 'Single video' format." string='LinkedIn Ad Format' tracking=True args: [('STANDARD_UPDATE', 'Standard update'), ('SINGLE_VIDEO', 'Single video')]
  • linkedin_is_test Boolean
    copy=False help='Whether LinkedIn flags this campaign as a test campaign.' readonly=True string='LinkedIn Test Campaign'
  • linkedin_locked Boolean
    compute='_compute_linkedin_locked' help='LinkedIn no longer accepts changes on this record.' store=True
  • linkedin_needs_update Boolean
    copy=False help="The campaign was modified in Odoo after being synchronized with LinkedIn. Use the 'Update in LinkedIn' button to push the local values." readonly=True string='LinkedIn Pending Changes'
  • linkedin_objective Selection
    copy=False help="Goal of the campaign on LinkedIn, required for the 'Single video' format:\n- Brand awareness: reach as many people as possible.\n- Video views: get the video of the post watched.\n- Website visits: send traffic to a page.\n- Engagement: get likes, comments and follows.\nLinkedIn has three more objectives (lead generation, website conversions and job applicants) that need a lead gen form, conversion tracking or LinkedIn Talent Solutions, which are configured outside Odoo and are therefore not offered here." string='LinkedIn Objective' tracking=True args: [('BRAND_AWARENESS', 'Brand awareness'), ('VIDEO_VIEWS', 'Video views'), ('WEBSITE_VISITS', 'Website visits'), ('ENGAGEMENT', 'Engagement')]
  • linkedin_political_intent Selection
    copy=False default='NOT_POLITICAL' help="Declaration required by LinkedIn to create a campaign: I confirm this is not political advertising. None of my ads qualify as political advertising under the law of the targeted countries, including EU law for ads targeted to the EU. Change it to 'Political advertising' when the campaign does qualify as such." string='LinkedIn Political Intent' tracking=True args: [('NOT_POLITICAL', 'Not political advertising'), ('POLITICAL', 'Political advertising'), ('NOT_DECLARED', 'Not declared')]
  • unit_cost Monetary
    help='Bid amount per click, impression or other event depending on the pricing model. LinkedIn only applies it with manual, target cost or cost cap bidding; with automatic bidding it is ignored.' tracking=True
Public methods (4)
  • action_archive_linkedin(self)
    Archive the campaign on LinkedIn. The Ads API does not allow deleting a campaign, so the campaign is kept in Odoo with its performance data and becomes read only.
  • action_publish_linkedin(self)
    Create the campaign group and the campaign on LinkedIn in DRAFT. The campaign can then be selected on posts and activated from Campaign Manager when desired.
  • action_update_linkedin(self)
    Push the local name, unit cost and daily budget to LinkedIn.
  • write(self, vals)

New fields (4)
  • currency_id Many2one → res.currency
    help='Currency of the total budget, sent to LinkedIn as the currency code of the campaign group. LinkedIn only accepts the currency of its advertising account.' args: 'res.currency'
  • linkedin_locked Boolean
    compute='_compute_linkedin_locked' help='LinkedIn no longer accepts changes on this record.' store=True
  • linkedin_needs_update Boolean
    copy=False help="The campaign group was modified in Odoo after being synchronized with LinkedIn. Use the 'Update in LinkedIn' button to push the local values." readonly=True string='LinkedIn Pending Changes'
  • total_budget Monetary
    help='Maximum amount to spend across all the campaigns and creatives of this group for its entire duration. It cannot be lower than the daily budgets of its campaigns.' tracking=True
Public methods (4)
  • action_archive_linkedin(self)
    Archive the campaign group on LinkedIn. The Ads API does not allow deleting a group. LinkedIn applies the same status to its campaigns, so run an import afterwards.
  • action_publish_linkedin(self)
    Create the campaign group on LinkedIn in DRAFT status. The group is also created automatically when the first campaign of the group is published with the 'Create in LinkedIn' button.
  • action_update_linkedin(self)
    Push the local name and total budget to LinkedIn.
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • creative_urn Char
    copy=False help='URN of the sponsored creative of this publication on LinkedIn.' string='Creative Reference'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.