BlueskyExecution icon
DiscordIncomingWebhook icon
Webhook icon

Celebrate Community Milestones on Bluesky from an Analytics Webhook

Celebrate community milestones on Bluesky automatically with Kestra. An analytics webhook posts the metric and count as a skeet and notes it in Discord.

Categories
Business

Milestones are the community's wins, and they land best when announced while the number is fresh, not a week later in a roundup. This blueprint automates that moment: when your analytics system detects a metric crossing a threshold, such as members, stars, or downloads, it POSTs a small JSON payload to a Kestra webhook, io.kestra.plugin.bluesky.BlueskyExecution posts an execution-notification skeet carrying the thank-you message through the project's Bluesky account, and Discord records internally that the milestone went public. On Bluesky, where developer communities follow projects directly, these posts consistently earn the warmest engagement a project account gets.

The skeet is public the instant the task succeeds, so the wording is deliberately fixed in the flow and only the numbers vary. Choose the milestone thresholds carefully upstream in the analytics system, because every webhook call becomes a public post. The post also wears its automation openly. It opens with the execution state and flow id and closes with a link to the execution, and a community that likes seeing the machinery behind a project tends to enjoy exactly that.

How it works

  1. The analytics_webhook trigger (io.kestra.plugin.core.trigger.Webhook) exposes a URL your analytics or monitoring system POSTs to with metric and count in the JSON body when a threshold is crossed.
  2. post_milestone (io.kestra.plugin.bluesky.BlueskyExecution) authenticates with the handle and app password from secrets and posts the celebration, with the numeric count interpolated directly into the customMessage sentence.
  3. The plugin always renders its built-in execution template: the post opens with the execution state and flow id, for example RUNNING: company.team/bluesky-community-milestone, then the custom message, and closes with a link to the execution in the Kestra UI. Bluesky's 300-grapheme limit applies to that whole rendered post, which the fixed wording plus the status line and link fits comfortably.
  4. Null-coalescing fallbacks (??) on both fields let the flow run manually with inputs, useful for milestones spotted by a human before the analytics system fires.
  5. note_internally posts the count and execution id to Discord, and the errors block raises a distinct alert when posting failed, because a missed celebration is invisible unless something reports it.

What you get

  • Milestone posts published the moment the metric crosses the line, while the number is news.
  • One consistent, pre-approved wording for every milestone, with only the figures changing.
  • An internal Discord note and a failure alert, so the community team always knows what was announced.
  • A manual path through flow inputs for milestones worth celebrating outside the automated thresholds.

Who it's for

  • Developer relations and community teams celebrating growth with their Bluesky audience.
  • Open source maintainers who want stars and download milestones acknowledged automatically.
  • Product teams turning analytics thresholds into public moments without manual posting.

Why orchestrate this with Kestra

An analytics alert that posts straight to a social API hides the credential in the alerting tool and fails silently when the API hiccups. In Kestra the app password stays in the secret store, every public post is an auditable execution tied to the payload that caused it, a transient Bluesky error is retryable, and a failed post alerts Discord instead of vanishing. The webhook boundary also keeps the analytics system decoupled from how and where the celebration is published.

Prerequisites

  • A Bluesky account for the project and an app password created under Settings, never the account password.
  • An analytics or monitoring system able to POST JSON when a metric crosses a threshold.
  • A Discord incoming webhook for the internal community channel.

Secrets

  • BLUESKY_IDENTIFIER: the Bluesky handle, for example yourproject.bsky.social.
  • BLUESKY_APP_PASSWORD: an app password generated in Bluesky settings.
  • DISCORD_WEBHOOK_URL: Discord incoming webhook URL.

Quick start

  1. Add the three secrets to your Kestra namespace.
  2. Replace the webhook key with a strong random value.
  3. Execute the flow manually with a test metric and count, and check the skeet on your Bluesky profile and the Discord note.
  4. Configure your analytics system to POST metric and count to the webhook URL when a milestone threshold is crossed.

How to extend

  • Add a message field to the webhook payload and feed it into customMessage for milestone-specific wording, keeping a fallback default, or move the raw figures into a customFields map so each number renders on its own line.
  • Announce releases through the same webhook pattern, as shown in the release notes blueprint.
  • Roll milestones into a weekly community recap, as shown in the changelog digest blueprint.
  • Post the milestone to additional channels by adding tasks after post_milestone, as shown in the blog announcer blueprint.

Links

See How

New to Kestra?

Use blueprints to kickstart your first workflows.