EU compliance — DSA fields and special ad categories
Last updated: May 19, 2026
EU compliance — DSA fields and special ad categories
DSA (Digital Services Act) = EU regulation requiring transparency on EU-targeted ads. Two required fields per the DTO: dsa_beneficiary (who benefits from the ad) + dsa_payor (who pays for it). Special Ad Categories (CREDIT, EMPLOYMENT, HOUSING, SOCIAL_ISSUES_ELECTIONS_OR_POLITICS) restrict targeting per US regulations. Wevion validates pre-flight; missing values block publish.
Who is this for
Anyone targeting EU geography. Anyone running ads in regulated categories (credit, jobs, housing, politics). Mandatory reading for EU mediabuyers.
DSA fields (EU regulation)
The Digital Services Act (EU regulation, fully enforced 2024+) requires advertisers to disclose:
Who benefits from the ad (the advertiser's legal entity)
Who pays for the ad (often same as beneficiary, sometimes different)
These fields surface in the ad's "Why am I seeing this ad?" transparency on the user side.
Wevion's DSA fields
Verified apps/backend/src/dto/request/bulk-launch.request.dto.ts:
dsa_beneficiary: Type.String({ description: 'DSA beneficiary' })
dsa_payor: Type.String({ description: 'DSA payor' })
Both required when targeting EU geo (any EU country in target_country or target_countries).
When required
Target geo | DSA required? |
|---|---|
Non-EU (e.g. US only) | No |
EU country (e.g. IT, DE, FR, ES, NL, ...) | Yes |
Mixed (US + EU) | Yes (for EU portion; Meta enforces) |
Worldwide | Yes (covers EU implicitly) |
EU country list includes 27 member states. Verify against Meta's official list.
What to enter
dsa_beneficiary: legal entity benefiting from the ad. Usually:
Your company's legal name (e.g. "Acme Corp Ltd")
For agencies: the client's legal entity (not the agency)
For e-commerce: the legal entity selling the products
dsa_payor: legal entity paying for the ad spend. Usually:
Same as beneficiary if the advertiser pays
The agency if the agency pays Meta directly and bills the client back
Verify with your finance / legal team
If you're unsure: ask the client + your finance team. Wrong values can lead to:
Ad rejection by Meta
Account suspension if pattern of wrong/fraudulent values
Special Ad Categories (US regulation)
If your ad falls in a special category (per US Fair Housing / Equal Credit Opportunity / Equal Employment regulations), you must declare it:
Verified apps/backend/src/types/campaigns/canonical.enums.ts SpecialAdCategory enum:
Category | When to declare |
|---|---|
CREDIT | Credit cards, loans, mortgages, BNPL services |
EMPLOYMENT | Job postings, recruitment ads, career opportunities |
HOUSING | Real estate, rentals, mortgages for purchase |
SOCIAL_ISSUES_ELECTIONS_OR_POLITICS | Political campaigns, election ads, social issue advocacy |
Restrictions when special category set
Restriction | Detail |
|---|---|
No narrow audience targeting | Cannot narrow by age (must be 18-65+), gender, ZIP code (housing) |
Limited interest targeting | Cannot use interests that could discriminate (e.g. parental status, religion, ethnicity) |
No lookalikes from minority-affected sources | Sources excluded by Meta's policy |
Authorized advertiser status required (politics only) | Separate verification process with Meta — see Meta Business Help |
Disclaimer ("Paid for by...") required (politics) | Wevion supports the field |
If you declare wrong:
Ad rejected by Meta on review
Account flagged for review (could lead to ad account suspension)
Misleading declarations could result in regulatory action
Honesty is essential. When in doubt, declare.
How Wevion validates
Pre-flight validation runs via apps/backend/src/services/launch-validation.service.ts:
EU geo + missing dsa_beneficiary →
DSA_BENEFICIARY_REQUIREDerrorEU geo + missing dsa_payor →
DSA_PAYOR_REQUIREDerrorSpecial category + age narrowing →
SPECIAL_AD_CATEGORY_VIOLATIONerrorPolitics + no authorized advertiser →
POLITICAL_NOT_AUTHORIZEDerror
Errors block publish. Surface in Pro mode + Express mode + Bulk Launch row validation.
Setup in Campaign Creator
Express mode
Audience step (3 of 6): country selector
If EU country selected: DSA fields appear at bottom of step
Special category dropdown also in this step (default: None)
Pro mode
Campaign-level config: Special Ad Categories field
Audience config (per adset): DSA fields appear if geo includes EU
Bulk Launch
Per-row columns:
dsa_beneficiary,dsa_payor,special_ad_categoriesValidation per row before publish
Template support
For repeatable launches with same legal entities:
Save DSA fields in Campaign Template
Future launches auto-fill (you can override per-campaign)
Agency: per-client templates with client's DSA fields
Multi-platform DSA
Meta enforces DSA strictly. Other platforms:
Google Ads: similar DSA fields, surface in Wevion as same fields
TikTok: emerging support; check current TikTok policy
Snapchat: limited EU presence; check current docs
Taboola: native ad platform; similar requirements
Wevion handles per-platform variants but the DSA concept is the same.
What you'll see
In Pro mode audience config with EU country:
Yellow warning: "EU geo selected — DSA fields required"
dsa_beneficiary+dsa_payorfields appear below countriesValidation badge: red until both filled
In Special Ad Category:
Dropdown with options (None / CREDIT / EMPLOYMENT / HOUSING / SOCIAL_ISSUES_ELECTIONS_OR_POLITICS)
If category selected: audience step shows restriction warnings (age locked to 18-65+, gender locked to All, etc.)
Examples
Example A: E-commerce shoes (EU target)
target_country: ITSpecial category: None (shoes not regulated)
dsa_beneficiary: "Acme Shoes Ltd"dsa_payor: "Acme Shoes Ltd"Targeting: standard (no restrictions)
Example B: Mortgage offer (US target)
target_country: USSpecial category: CREDIT
dsa_beneficiary: N/A (not EU)Targeting restrictions: age 18-65+, all genders, no narrow ZIP targeting
Example C: Job posting (multi-region)
target_countries: US + UK + DESpecial category: EMPLOYMENT
DSA fields required (EU portion):
dsa_beneficiary= "Recruiter Corp Ltd",dsa_payor= "Recruiter Corp Ltd"Targeting restrictions: age 18-65, no narrow geo
Example D: Political campaign (US)
target_country: USSpecial category: SOCIAL_ISSUES_ELECTIONS_OR_POLITICS
Requires authorized advertiser status on Meta (separate verification)
Includes "Paid for by..." disclaimer field
Targeting restrictions: heavy
Common mistakes
EU geo + no DSA fields → publish blocked. Surfaced by pre-flight.
Wrong DSA values (typos, mismatched entities) → ad may be approved but flagged later; account at risk.
Hiding a regulated ad in "None" category → Meta detects + rejects + account flag.
Lookalikes from a regulated category source → Meta blocks: "Cannot use this audience for special ad category".
Best practices
Pre-fill DSA in templates
Save your team's standard DSA values in templates. Reduces per-launch friction.
Verify with legal + finance
DSA fields are legal disclosures — get sign-off from legal
Especially for agency clients: agency vs client as payor matters
Document special category triggers
Internal doc: when does a campaign qualify as CREDIT / EMPLOYMENT / HOUSING / POLITICS?
Train team to declare correctly
Better to over-declare than miss
Stay current with regulations
DSA evolves; check Meta's policy updates
Special categories update yearly
Subscribe to Meta Business Help for changes
Common questions
"What if my company is non-EU but targeting EU users?": still need DSA fields. Use your home-country legal entity.
"Can I leave DSA blank for B2B-only campaigns?": No — DSA applies regardless of B2B/B2C if EU geo targeted.
"What if agency pays Meta but charges client back?": agency is the
dsa_payor; client is thedsa_beneficiary."Does DSA apply to organic posts boosted as ads?": Yes — once boosted, same DSA requirements apply.
"Can I edit DSA fields after publish?": usually no without re-launching. Configure correctly at publish.
Related
Audience targeting — where DSA fields appear in flow
Common publishing errors — DSA validation errors
Publish paused vs active — DSA-affected ads benefit from pause-first verification