Skip to main content
Send notifications to external services like Slack to integrate App Store Connect CLI into your CI/CD workflows.

Quick Start

export ASC_SLACK_WEBHOOK="https://hooks.slack.com/services/..."
asc notify slack --message "Build uploaded"
asc notify slack --message "Release ready" --channel "#deployments"

Subcommands

  • slack - Send a message to Slack via webhook

Commands

notify slack

Send a message to Slack via incoming webhook:
asc notify slack --webhook "https://hooks.slack.com/..." --message "Build uploaded"
asc notify slack --message "Done" --channel "#deployments"
ASC_SLACK_WEBHOOK=$WEBHOOK asc notify slack --message "Release v2.1 ready"
Flags:
  • --webhook - Slack webhook URL (or set ASC_SLACK_WEBHOOK env var)
  • --channel - Slack channel override (#channel or @username)
  • --message - Message to send to Slack (required)
  • --thread-ts - Parent message timestamp (thread_ts) for posting a threaded reply
  • --blocks-json - Slack Block Kit JSON array
  • --blocks-file - Path to Slack Block Kit JSON array file
  • --payload-json - JSON object of release fields to include as Slack attachment fields
  • --payload-file - Path to JSON object file for release payload fields
  • --pretext - Optional text shown above attachment payload fields (requires --payload-json/--payload-file)
  • --success - Set attachment color to success (true) or failure (false, default: true)

Basic Usage

Simple Message

asc notify slack \
  --webhook "https://hooks.slack.com/services/..." \
  --message "Build uploaded successfully"

Channel Override

asc notify slack \
  --message "Deployment complete" \
  --channel "#deployments"
Note: Slack may ignore channel overrides for incoming webhooks based on app settings.

Environment Variable

Set the webhook URL via environment variable:
export ASC_SLACK_WEBHOOK="https://hooks.slack.com/services/..."
asc notify slack --message "Build complete"

Advanced Features

Threaded Replies

Post a message as a reply to an existing thread:
asc notify slack \
  --message "Build update" \
  --thread-ts "1733977745.12345"
Note: The thread-ts value must be in Slack timestamp format (e.g., 1733977745.12345). Webhook POST returns only “ok”, so you need to obtain the parent message ts from Slack APIs/events.

Block Kit Messages

Use Slack Block Kit for rich message formatting:
asc notify slack \
  --message "Release ready" \
  --blocks-json '[{"type":"section","text":{"type":"mrkdwn","text":"*Release* ready"}}]'
Or load from a file:
asc notify slack \
  --message "Release ready" \
  --blocks-file ./blocks.json
blocks.json:
[
  {
    "type": "section",
    "text": {
      "type": "mrkdwn",
      "text": "*Release v2.1.0* ready for deployment"
    }
  },
  {
    "type": "section",
    "fields": [
      {
        "type": "mrkdwn",
        "text": "*App:*\nMyApp"
      },
      {
        "type": "mrkdwn",
        "text": "*Version:*\n2.1.0"
      }
    ]
  }
]

Attachment Payloads

Include structured data as attachment fields:
asc notify slack \
  --message "Release submitted" \
  --payload-json '{"app":"MyApp","version":"1.2.3","build":"42"}'
With pretext and color:
asc notify slack \
  --message "Release submitted" \
  --pretext "New release ready" \
  --payload-json '{"app":"MyApp","version":"1.2.3","build":"42"}' \
  --success true
Or load from a file:
asc notify slack \
  --message "Release submitted" \
  --payload-file ./release.json
release.json:
{
  "app": "MyApp",
  "version": "1.2.3",
  "build": "42",
  "platform": "iOS",
  "submitted": "2026-03-04T12:34:56Z"
}

CI/CD Integration

GitHub Actions

name: Notify Slack
on:
  workflow_dispatch:

jobs:
  notify:
    runs-on: ubuntu-latest
    steps:
      - name: Notify Slack
        env:
          ASC_SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
        run: |
          asc notify slack --message "Build uploaded for MyApp v1.2.3"

GitLab CI

notify:
  stage: notify
  script:
    - asc notify slack --message "Pipeline complete for $CI_COMMIT_REF_NAME"
  variables:
    ASC_SLACK_WEBHOOK: $SLACK_WEBHOOK

Fastlane Integration

lane :notify_slack do |options|
  message = options[:message] || "Build complete"
  sh(
    "asc",
    "notify",
    "slack",
    "--message",
    message
  )
end

Examples

Build Upload Notification

#!/bin/bash
set -e

# Upload build
asc builds upload --ipa ./MyApp.ipa

# Notify Slack
asc notify slack \
  --message "New build uploaded for MyApp" \
  --payload-json '{"version":"1.2.3","build":"42"}'

TestFlight Distribution

#!/bin/bash
set -e

BUILD_ID="12345"
GROUP_ID="67890"

# Add build to TestFlight group
asc builds add-groups --build "$BUILD_ID" --group "$GROUP_ID"

# Notify Slack
asc notify slack \
  --message "Build distributed to TestFlight" \
  --channel "#qa" \
  --payload-json '{"build":"'$BUILD_ID'","group":"Internal Testers"}'

Submission Status

#!/bin/bash
set -e

VERSION="1.2.3"
BUILD_ID="12345"

# Submit for review
asc submit create \
  --app "$APP_ID" \
  --version "$VERSION" \
  --build "$BUILD_ID" \
  --confirm

# Notify Slack with success
asc notify slack \
  --message "Version $VERSION submitted for review" \
  --pretext "App Store submission" \
  --payload-json '{"app":"MyApp","version":"'$VERSION'","build":"'$BUILD_ID'"}' \
  --success true

Error Notification

#!/bin/bash

# Run command and capture error
if ! asc builds upload --ipa ./MyApp.ipa 2>&1; then
  # Notify Slack on failure
  asc notify slack \
    --message "Build upload failed" \
    --pretext "CI/CD Error" \
    --payload-json '{"job":"upload","status":"failed"}' \
    --success false
  exit 1
fi

Security

Webhook URL Security

  • Only https://hooks.slack.com and https://hooks.slack-gov.com are allowed by default
  • IP addresses are rejected
  • The webhook URL must start with /services/
  • For local testing, set ASC_SLACK_WEBHOOK_ALLOW_LOCALHOST=1 to allow http://localhost

Environment Variables

Store sensitive webhook URLs in environment variables or CI/CD secrets:
# Don't commit webhook URLs to version control
export ASC_SLACK_WEBHOOK="https://hooks.slack.com/services/..."

# Use in CI/CD
asc notify slack --message "Build complete"

Troubleshooting

Channel Override Not Working

Slack may ignore channel overrides for incoming webhooks based on app configuration. Configure the default channel in your Slack app settings.

Webhook Returns Error

Check that:
  • The webhook URL is valid and active
  • The URL starts with https://hooks.slack.com/services/ or https://hooks.slack-gov.com/services/
  • The message is not empty
  • JSON payloads are valid

Message Not Appearing

Verify:
  • The webhook URL is correct
  • The Slack app has permission to post to the channel
  • The message format is valid
  • Block Kit JSON is properly formatted