Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: adds sponsored post UI #7518

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

aendra-rininsland
Copy link
Contributor

I haven't been able to test this at all because I can't get Yarn to install and also because it's reliant on bluesky-social/atproto#3419. If someone could review this with that in mind I'd be most appreciative, it's not a particularly complex PR once the lexicon change gets merged. 🙏

This adds a "⚡ Sponsored" label to any post that has the forthcoming app.bsky.graph.defs#skeletonReasonSponsored reason attached to the post. I have chosen the icon and text completely arbitrarily; I have also not provided translations because I don't know how you're generating locales. It's possible another icon (possibly something like ) would be better.

Please see bluesky-social/atproto#3386 for the rationale for this request.

@pfrazee
Copy link
Collaborator

pfrazee commented Jan 21, 2025

Okay this is super interesting and I appreciate what yall are driving here. Can you give us 2 weeks to finish some internal conversations? This cross-cuts some very big picture stuff.

@aendra-rininsland
Copy link
Contributor Author

Hi @pfrazee — not to nag, but any update on this? I have several campaigns wanting to launch but I don't feel comfortable doing so until there's some way to flag them as promoted.

@DGaffney
Copy link

DGaffney commented Feb 5, 2025

ditto on this @pfrazee - we're basically ready on our end to roll

@trezy
Copy link

trezy commented Feb 19, 2025

It'd be great to see some movement on this, either with regards to merging this PR or elaborating on what the alternative is. I'm actively hosting a discussion with my community on the Game Dev feed about running ads. Being able to properly flag them as ads would be great, but for now we're working out our own solutions — none of which fully address the issue. 😞

An excerpt from the thread:

Hey #GameDev, what are everybody's thoughts on ads in the game dev feed? I'm looking for ways to support my work, so lemme explain about what this would look like. 🧵

...

One of my concerns is that there's no indicator that something is an ad. You may be able to recognize it because it shows up more regularly than other skeets or seems out of place, but you're technically seeing ads that don't look like ads, and that feels weird.

And the most common response is concern about ads not being flagged as such:

A list of relevant quotes from users of the Game Dev feed:

Not sure I feel super comfortable with ads not being labeled as ads. I can't complain about ads supporting a free platform, but it needs to be apparent that's what I'm looking at.

- @ncrafters.bsky.social

I would be okay with this as long as the 3 are met:

  1. Ads are marked clearly.
  2. Ads stay relevant (ppl advertising art, music, programming for hire. Or ads from devs for their game, no scam mobile/AI games).
  3. It stays a reasonable ratio between ads and regular posts, a.k.a. not too many ads.

- @busyclmusic.bsky.social

I’d be okay with occasional ads as long as they are marked in some way.

Another idea is, Depending on the amount of costs/work involved, I wonder if you could find 1 company to sponsor the feed(s) for some period of time which would be mentioned in description and maybe the occasional post.

- @fpcorso.bsky.social

Honestly no, unless you fix the "can't tell it's an ad" part. If every ad requires the text "Ad 🗞️" or something then sure. Twitter testing ads that did not identify as ads was a huge red flag.

- @gord.games

I think it's probably a good idea. Like you I am kind of put off by the fact that they won't look like ads, but whatever. Go for it.

- @gearheadrpg.com

As long as, like you said, the ads are clearly marked with a hashtag, I have no problem with that. Do what you have to do! Also, I think it's cool that they give you this kind of control over the skeets that are injected as ads.

- @oldschoolpixels.com

I am not a lawyer, nor do I play one on TV, but I think rules in the UK and EU (and probably elsewhere) require that you make clear that any paid-for advertising or promotion is indicated as such.

- jackaidley.bsky.social

I think as long as the ad posts are properly moderated to prevent any issues that could arise with repeat posts n whatnot, I would not mind if ppl could pay to have a little boost on the feed if need be.

Also having ads clearly marked as such would be nice if possible.

- @silviafoxtris.bsky.social

Another solution that's being actively worked on is the AdControls labeler by @yesthatwes.bsky.social. The idea is that users and advertisers would need to opt-in to the labeler, and then they'd see/have the appropriate labels applied based on post content. It's an interesting solution, but requiring users to opt-in means we'll have to see significant user adoption for it to have any impact, and that gets harder every day as the platform grows. A first-party solution is really the only way to approach this issue.

@FlippingBinary
Copy link

Another solution that's being actively worked on is the AdControls labeler by @yesthatwes.bsky.social. The idea is that users and advertisers would need to opt-in to the labeler, and then they'd see/have the appropriate labels applied based on post content. It's an interesting solution, but requiring users to opt-in means we'll have to see significant user adoption for it to have any impact, and that gets harder every day as the platform grows. A first-party solution is really the only way to approach this issue.

I'm in favor of sponsored becoming a core label with an extension to the labeling mechanism that allows for a reason (similar to what this PR does, but broadened so any label can have an optional reason). Tapping on the label could show the label's standard description, along with the label reason, if one exists for the post or account, preferably with URLs and @ handles turned into links in the app so relevant discussions or accounts can be cross-linked. Self-labeling already exists, so this could integrate nicely with self-disclosed sponsorships and other types of labels that would be more useful to users if accompanied by a reason.

@peat
Copy link

peat commented Feb 20, 2025

@aendra-rininsland Do you think it would be helpful to clarify attribution instead of just saying it's a sponsored post?

For example, if a cat food company wants one of their posts to show up in my feed, we could disclose that [feed owner DID] is promoting [post DID] from [cat food company DID]

Instead of "Sponsored" it could be "Promoted by [feed owner]"

That's an interesting social/financial data point, discloses the origin and reason for the content, and provides enough information to disambiguate disclosures so that the appview owner isn't held accountable for the sponsored content.

@aendra-rininsland
Copy link
Contributor Author

@aendra-rininsland Do you think it would be helpful to clarify attribution instead of just saying it's a sponsored post?

For example, if a cat food company wants one of their posts to show up in my feed, we could disclose that [feed owner DID] is promoting [post DID] from [cat food company DID]

This is a really good idea. I was wanting to surface some sort of information like that but I wasn't sure the best way to given the minimal design impact I'm ultimately aiming for with this PR. Let me make an attempt at that and report back...

@FlippingBinary
Copy link

For example, if a cat food company wants one of their posts to show up in my feed, we could disclose that [feed owner DID] is promoting [post DID] from [cat food company DID]

Instead of "Sponsored" it could be "Promoted by [feed owner]"

How would someone indicate a sponsorship or promotion that is funded by a company that isn't on BlueSky/ATproto?

@peat
Copy link

peat commented Feb 20, 2025

How would someone indicate a sponsorship or promotion that is funded by a company that isn't on BlueSky/ATproto?

I expect that 90% of the time it will be the author of the post that's being promoted. I'm not concerned about legal entities in the real world, just provenance within the AT Proto ecosystem.

The funding question gets complicated. Is it Cat Food company that's funding it, or an agency they hired, or even the feed host? I recommend that it would be up to the feed generator to make the appropriate attribution.

@FlippingBinary
Copy link

FlippingBinary commented Feb 20, 2025

How would someone indicate a sponsorship or promotion that is funded by a company that isn't on BlueSky/ATproto?

I expect that 90% of the time it will be the author of the post that's being promoted. I'm not concerned about legal entities in the real world, just provenance within the AT Proto ecosystem.

Okay, I just wanted to clarify because it seems like that system would only work if the sponsoring entity has an AT proto DID, which would limit the utility of the sponsorship indicator and may be confusing to users who see sponsored posts that are unlabeled when the reason is just because the sponsor isn't on AT proto...

The funding question gets complicated. Is it Cat Food company that's funding it, or an agency they hired, or even the feed host? I recommend that it would be up to the feed generator to make the appropriate attribution.

Yeah, auditing the money trail is a complicated subject and out of scope, I think. That's why I think a sponsored label with the ability for it to be accompanied by a reason string would be ideal in the context of the AT proto. Feed generators AppViews that boost posts should probably have their own way of distinguishing between posts they promote and those that are simply sponsored by "someone".

Edit: I was thinking of AppViews when I wrote feed generators.

@aendra-rininsland
Copy link
Contributor Author

I've changed the text in the PR to read Promoted by [username] on [feed name].

Is this good? All feedback welcome.

@peat
Copy link

peat commented Feb 21, 2025

Okay, I just wanted to clarify because it seems like that system would only work if the sponsoring entity has an AT proto DID, which would limit the utility of the sponsorship indicator and may be confusing to users who see sponsored posts that are unlabeled when the reason is just because the sponsor isn't on AT proto...

Dogmatically I'm in the "AT Proto should eat the world" camp and would love to make it required, but pragmatically ... yes, it's an impractical requirement. 😅

Yeah, auditing the money trail is a complicated subject and out of scope, I think.

Agreed. I was thinking it would be interesting data for tracking provenance ... but we definitely don't want to muddy the waters with some kind of financial auditing concept. A reason string could work as well.

The end goal here is attribution -- whatever mechanism makes that possible.

@pfrazee
Copy link
Collaborator

pfrazee commented Feb 21, 2025

We're having to learn a lot really fast to come up with a good answer, so please bear with us. We're talking with Graze actively and would be happy to talk to some more folks directly. I'm not entirely convinced that people will understand the provenance that's being proposed here, even when it's more verbose, but more importantly I'm not sure the appview is outside of the chain of responsibility no matter how this is done. The troll cases concern me quite a bit, and with dynamic responses we have very little upfront auditing time. I hate blocking yall when we want to enable yall, but we need more time to understand the situation.

@FlippingBinary
Copy link

I think we're talking about two related concepts that require distinct approaches, and I may have inadvertently muddled the conversation a bit. If so, I apologize. To clarify, let me define them:

Boosted content - This refers to posts or accounts whose ranking in an AppView or feed is prioritized by the platform in exchange for payment. The content itself isn't necessarily influenced by money, but its visibility is.

Paid endorsements - These are messages where the endorsing account has a financial relationship with the brand. Here, the content is influenced by money, but not necessarily its visibility.

To address boosted content, @aendra-rininsland's collection of PRs (particularly the AT proto one), with @peat's idea about linking posts to the DID that paid for the boost, looks like an excellent solution. It seems to provide a mechanism for feed generators to disclose why a post got boosted, enabling AppViews to inform users transparently.

For paid endorsements, the concept of the AdControls labeler that @trezy mentioned is a great approach that would be even better with a new global label and a reason (or why field) added to the label spec. I'd love to talk about it more, but that might be out of scope for this PR.

@trezy
Copy link

trezy commented Feb 24, 2025

@pfrazee I'd be open to chatting more about this with your team as well. I've been actively courting my Game Dev community about ads for the past week and I've gathered a lot of feedback about their feelings on ads. Without exception, this is the largest concern my users have. Feel free to poke me on Discord (@trezy) if you want to have a more realtime conversation.

@allanbunch
Copy link

Regarding native advertising types and disclosure: The IAB Native Advertising Playbook guidelines are helpful here since this is an AdTech concern. Check out the sections starting at ~page 15.

@clarabellexyz
Copy link

clarabellexyz commented Feb 28, 2025

It'd be great to see some movement on this, either with regards to merging this PR or elaborating on what the alternative is. I'm actively hosting a discussion with my community on the Game Dev feed about running ads. Being able to properly flag them as ads would be great, but for now we're working out our own solutions — none of which fully address the issue. 😞

The idea is that users and advertisers would need to opt-in to the labeler, and then they'd see/have the appropriate labels applied based on post content. It's an interesting solution, but requiring users to opt-in means we'll have to see significant user adoption for it to have any impact, and that gets harder every day as the platform grows. A first-party solution is really the only way to approach this issue.

Agree with all of this. The current workaround (asking advertisers to use #sponsored or #ad in any promoted post) is not viable and potentially creates a ton of issues down the line:

  • #ad or #sponsored is misleading when a post is viewed in other contexts or in other feeds where it's behaving as just as a regular post. Ads are just posts that are in a temporary state of being boosted; having a permanent #ad designation on every sponsored post even when it's no longer being sponsored will make it seem like there are way, way more ads on bluesky than there actually are and cause so much confusion.
  • anyone can use these tags in their posts, making it seem like the feed owner or bluesky itself is promoting or allowing sponsored content that might be offensive/illegal/off topic
  • these tags are easily muted / used to create blocklists. I can definitely see the appeal of being able to opt out of ads in some way, but I don't want small businesses or artists/creatives to wind up getting less visibility as a result of using these tools

@clarabellexyz
Copy link

I've changed the text in the PR to read Promoted by [username] on [feed name].

Is this good? All feedback welcome.

Assuming [username] here is the advertiser, not the feed owner, I think that makes sense. That way the viewer can tell a) where the post is being promoted: the feed, b) who paid for it: username of advertiser and c) the post itself that is being sponsored.

@femavibes
Copy link

femavibes commented Mar 1, 2025

It'd be great to see some movement on this, either with regards to merging this PR or elaborating on what the alternative is. I'm actively hosting a discussion with my community on the Game Dev feed about running ads. Being able to properly flag them as ads would be great, but for now we're working out our own solutions — none of which fully address the issue. 😞
The idea is that users and advertisers would need to opt-in to the labeler, and then they'd see/have the appropriate labels applied based on post content. It's an interesting solution, but requiring users to opt-in means we'll have to see significant user adoption for it to have any impact, and that gets harder every day as the platform grows. A first-party solution is really the only way to approach this issue.

Agree with all of this. The current workaround (asking advertisers to use #sponsored or #ad in any promoted post) is not viable and potentially creates a ton of issues down the line:

  • #ad or #sponsored is misleading when a post is viewed in other contexts or in other feeds where it's behaving as just as a regular post. Ads are just posts that are in a temporary state of being boosted; having a permanent #ad designation on every sponsored post will make it seem like there are way, way more ads on bluesky than there actually are and cause so much confusion.

Ideally a post is flagged as an #ad or #sponsored in its intended promoted location, and outside of that it's not--that would be confusing.

But I do think users should be aware a post is boosted in all contexts and the likes/reposts/comments are less organic due to the boost. My initial thought is a sponsored tag when viewing in a promoted context and a greyed out sponsored tag when viewing the post in a non sponsored context.

It just feels weird for sponsored content to present itself as a normal post when viewed outside of a feed it's promoted in.

And lastly, some distinction between hand-picked sponsored content picked by a feedmakers as a partner vs general ads would be nice.

There's a big difference between turning on general ads for a feed vs feedmakers personally partnering up with brands.

@allanbunch
Copy link

I do think users should be aware a post is boosted in all contexts and the likes/reposts/comments are less organic due to the boost.

Good point on transparency. Labeling is a must.

I think concerns about 'less organic' engagement apply more to traditional ad network delivery than curation-based promoted media. Since we're all about placement rather than mass distribution or algorithmic reach, engagement on a boosted post isn't necessarily 'less organic' unless it has monetized placement in a bunch of feeds. But even then, it doesn't carry the same engagement network effect as algorithmic distribution. The key question remains how labeling should work in a way that fits the Bluesky feed model.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants