{"id":41429687,"url":"https://github.com/tableau/pulse-api-utilities","last_synced_at":"2026-01-23T14:26:25.004Z","repository":{"id":320578454,"uuid":"1071010717","full_name":"tableau/pulse-api-utilities","owner":"tableau","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-12T20:13:18.000Z","size":285,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-13T00:49:04.282Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tableau.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-06T18:34:58.000Z","updated_at":"2026-01-12T20:13:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"943cb981-49b8-4a56-8bd9-b4d3e1fe31e1","html_url":"https://github.com/tableau/pulse-api-utilities","commit_stats":null,"previous_names":["tableau/pulse-api-utilities"],"tags_count":0,"template":false,"template_full_name":"salesforce/oss-template","purl":"pkg:github/tableau/pulse-api-utilities","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tableau%2Fpulse-api-utilities","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tableau%2Fpulse-api-utilities/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tableau%2Fpulse-api-utilities/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tableau%2Fpulse-api-utilities/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tableau","download_url":"https://codeload.github.com/tableau/pulse-api-utilities/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tableau%2Fpulse-api-utilities/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28694094,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T14:15:13.573Z","status":"ssl_error","status_checked_at":"2026-01-23T14:09:05.534Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-23T14:26:23.661Z","updated_at":"2026-01-23T14:26:24.985Z","avatar_url":"https://github.com/tableau.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tableau Pulse Utilities\n\nA comprehensive web application suite for managing Tableau Pulse with nine powerful utilities, built with Python Flask and featuring a modern, responsive UI.\n\n## 🚀 Available Utilities\n\n### 1. 📊 Copy Pulse Definitions\nTransfer Tableau Pulse definitions between different sites\n- Copy individual definitions by ID or all definitions from a datasource\n- Cross-site copying with full authentication support\n- Preserves all definition metadata and configurations\n\n### 2. 👥 Bulk Manage Followers\nAdd or remove followers from Pulse metrics using email addresses\n- Bulk operations on multiple metrics simultaneously\n- Email-based user identification (converts emails to user IDs automatically)\n- Support for both adding and removing followers\n\n### 3. 🔄 Swap Datasources\nCopy definitions with new datasources and migrate all metrics + followers\n- Creates new definitions with different datasources\n- Migrates all associated metrics and their followers\n- Optional cleanup of old metric followers\n\n### 4. ⚙️ Update User Preferences\nUpdate Tableau Pulse user preferences for single or multiple users\n- Configure cadence settings (daily, weekly, monthly)\n- Manage email and Slack channel preferences\n- Set metric grouping and sorting options\n- Bulk update preferences for multiple users\n\n### 5. ✅ Check Certified Metrics\nView all certified metrics and optionally remove certifications from unauthorized users\n- List all metric definitions with certification status\n- Filter by group name (automatic group ID lookup)\n- Automatically remove certifications from non-group members\n- Comprehensive reporting with certification details\n\n### 6. 📊 Bulk Create Scoped Metrics\nCreate multiple scoped metrics from a source metric with CSV upload support for advanced features\n- **📄 CSV Upload Mode**: Upload a CSV file with dimension name, filter values, and follower emails\n  - Column 1: Dimension name (e.g., \"Region\")\n  - Column 2: Comma-separated filter values (e.g., \"East, West\" creates a metric with BOTH values)\n  - Column 3: Comma-separated follower emails (optional)\n- **✏️ Manual Entry Mode**: Simple text input for single filter value per metric\n- **👥 Auto-assign Followers**: Automatically add followers by email when creating metrics\n- **🔍 Multiple Filters**: Create metrics with multiple dimension values in a single filter\n- Each new metric includes all filters from the source plus the new dimension filter(s)\n\n### 7. 📈 Pulse Analytics\nGet comprehensive insights and analytics about Pulse metric usage across your site\n- **📊 Overall Statistics**: Total definitions, metrics, subscriptions, and unique followers\n- **🏆 Top Metrics**: See which individual metrics have the most followers\n- **📈 Top Definitions**: Discover which metric definitions are most popular across all their metrics\n- **🗄️ Datasource Usage**: Understand which datasources are driving the most engagement\n- **✅ Certification Insights**: Track how many definitions are certified\n- **Interactive Dashboard**: Visual cards and sortable tables for easy analysis\n\n### 8. 🔍 Zero Follower Metrics\nFind metrics within a definition that have no followers\n- **📊 Analyze by Definition**: Enter a Pulse definition ID to analyze all its metrics\n- **🚫 Identify Unused Metrics**: Find metrics with zero followers (both default and scoped)\n- **🗑️ Optional Deletion**: Automatically delete non-default metrics with zero followers\n- **📋 Detailed Reporting**: View metrics with zero followers and metrics with followers side-by-side\n- **⚠️ Safe Deletion**: Default metrics cannot be deleted and are automatically skipped\n\n### 9. 📑 Export Definitions\nExport all Pulse metric definitions to CSV for documentation or analysis\n- **📋 Basic Mode**: Export essential fields - Name, Measure, Time Dimension, Definitional Filters, Datasource Name\n- **📊 Verbose Mode**: Export all configuration details including extension options, comparisons, certification status, and more\n- **🎨 Viz State Support**: Handles Viz State definitions appropriately (marks measure/filters as embedded)\n- **📥 Download CSV**: Tab-delimited CSV file with one row per definition\n- **🗄️ Datasource Names**: Automatically resolves datasource IDs to names\n\n## ✨ Common Features\n\n- 🔐 **Multiple Authentication**: Supports both username/password and Personal Access Token (PAT) authentication\n- 🌟 **Modern UI**: Beautiful, gradient interface with glass morphism effects and animations\n- 🚀 **Real-time Progress**: Live updates during operations\n- 📱 **Responsive Design**: Works seamlessly on desktop and mobile devices\n- ✨ **Error Handling**: Comprehensive error reporting and validation\n- 🏠 **Utility Selector**: Easy-to-use front page for choosing which tool to use\n\n## Project Structure\n\n```\nhello-world-app/\n├── app.py              # Flask application with Pulse API integration\n├── requirements.txt    # Python dependencies (Flask, requests)\n├── README.md          # This file\n└── templates/\n    └── index.html     # Web UI with form and progress tracking\n```\n\n## Setup and Installation\n\n### Prerequisites\n\n- Python 3.7+ installed on your system\n- pip (Python package installer)\n\n### Installation Steps\n\n1. **Navigate to the project directory:**\n   ```bash\n   cd hello-world-app\n   ```\n\n2. **Create a virtual environment (recommended):**\n   ```bash\n   python -m venv venv\n   ```\n\n3. **Activate the virtual environment:**\n   - On macOS/Linux:\n     ```bash\n     source venv/bin/activate\n     ```\n   - On Windows:\n     ```bash\n     venv\\Scripts\\activate\n     ```\n\n4. **Install dependencies:**\n   ```bash\n   pip install -r requirements.txt\n   ```\n\n## Running the Application\n\n1. **Start the Flask server:**\n   ```bash\n   python app.py\n   ```\n\n2. **Open your web browser and visit:**\n   ```\n   http://localhost:3000\n   ```\n\n3. **You'll see the Pulse Definition Copier interface with:**\n   - Welcome tab with overview and features\n   - Copy Definitions tab with the main form\n   - Real-time progress tracking during operations\n\n## 📋 Usage Guide\n\n### Getting Started\n1. Start the application and visit `http://localhost:3000`\n2. Choose one of the nine available utilities from the home page\n3. Fill in the required connection and configuration details\n4. Monitor real-time progress and results\n\n### 📊 Using Copy Pulse Definitions\n1. **Source Site Configuration**:\n   - Enter source Tableau Server URL\n   - Provide site content URL and authentication credentials\n   - Specify the source datasource name\n\n2. **Destination Site Configuration**:\n   - Enter destination Tableau Server URL  \n   - Provide destination site details and credentials\n   - Specify the destination datasource name\n\n3. **Definition Selection**:\n   - Enter specific definition IDs (comma-separated) or \"all\" for all definitions\n   \n4. **Execute**: Click \"🚀 Start Copying\" and monitor progress\n\n### 👥 Using Bulk Manage Followers\n1. **Site Connection**:\n   - Enter Tableau Server URL and site content URL\n   - Choose authentication method and provide credentials\n\n2. **Action Configuration**:\n   - Select action: \"Add Followers\" or \"Remove Followers\"\n   - Enter metric IDs (comma-separated)\n   - Enter user email addresses (comma-separated or one per line)\n\n3. **Execute**: Click \"👥 Manage Followers\" and monitor progress\n\n### 🔄 Using Swap Datasources\n1. **Site Connection**:\n   - Enter Tableau Server URL and site content URL\n   - Provide authentication credentials\n\n2. **Copy Configuration**:\n   - Enter the Pulse Definition ID to copy\n   - Enter the new Datasource LUID to use\n\n3. **Cleanup Options**:\n   - Optionally remove followers from old metrics after copying\n\n4. **Execute**: Click \"🔄 Swap Datasources\" and monitor progress\n\n### ⚙️ Using Update User Preferences\n1. **Server Connection**:\n   - Enter Tableau Server URL and API version\n   - Provide site content URL and authentication credentials\n\n2. **Users Configuration**:\n   - Enter user email addresses (comma-separated or one per line)\n\n3. **Pulse Preferences**:\n   - Set cadence (daily, weekly, monthly)\n   - Configure email and Slack channel delivery\n   - Set metric grouping and sort order preferences\n\n4. **Execute**: Click \"⚙️ Update User Preferences\" and monitor progress\n\n### ✅ Using Check Certified Metrics\n1. **Server Connection**:\n   - Enter Tableau Server URL and API version\n   - Provide site content URL and authentication credentials\n\n2. **Group Configuration (Optional)**:\n   - Enter a Group Name to filter certifications by group membership\n   - The tool will automatically look up the group ID from the name\n   - Leave empty to view all certified metrics without filtering\n\n3. **Certification Removal (Optional)**:\n   - Check the box to automatically remove certifications from metrics certified by non-group members\n   - Requires a Group Name to be specified\n\n4. **Execute**: Click \"✅ Check Certified Metrics\" and view the results\n\n   The tool will:\n   - List all metric definitions with certification status\n   - Show which metrics were certified by group members vs. non-members (if group specified)\n   - Display certifier information and certification dates\n   - Optionally remove certifications from unauthorized users\n\n### 📊 Using Bulk Create Scoped Metrics\n1. **Server Connection**:\n   - Enter Tableau Server URL and API version\n   - Provide site content URL and authentication credentials\n\n2. **Source Metric Configuration**:\n   - Enter the Source Metric ID (the existing scoped metric to use as a template)\n\n3. **Input Mode Selection**:\n   - **CSV Upload (Recommended)**:\n     - Upload a CSV file with 3 columns:\n       - Column 1: Dimension name (e.g., \"Region\")\n       - Column 2: Comma-separated filter values (e.g., \"East, West\")\n       - Column 3: Comma-separated follower emails (optional)\n     - Example CSV:\n       ```csv\n       Region,East,user1@example.com\n       Region,\"East, West\",user2@example.com\n       Department,Sales,\"user3@example.com, user4@example.com\"\n       ```\n   - **Manual Entry**:\n     - Enter Dimension Name (e.g., \"Region\", \"Category\")\n     - Enter dimension values (comma-separated)\n     - Creates one metric per value (no follower assignment)\n\n4. **Execute**: Click \"📊 Create Scoped Metrics\" and monitor progress\n\n   The tool will:\n   - Retrieve the source metric and its specification\n   - Create a new scoped metric for each CSV row (or dimension value in manual mode)\n   - Each new metric will have all filters from the source metric plus new filter(s) for the dimension value(s)\n   - Automatically add followers by email (CSV mode only)\n   - Display success/failure for each created metric and follower addition\n\n   **Example**: If you start with metric X that shows \"Total Sales\", choose dimension \"Region\", and provide values \"East, West, North, South\", the tool will create 4 new scoped metrics:\n   - Total Sales (Region=East)\n   - Total Sales (Region=West)\n   - Total Sales (Region=North)\n   - Total Sales (Region=South)\n\n### 📈 Using Pulse Analytics\n1. **Server Connection**:\n   - Enter Tableau Server URL and API version\n   - Provide site content URL and authentication credentials\n\n2. **Generate Analytics**: Click \"📈 Generate Analytics\" and wait for data collection\n\n   The tool will:\n   - Retrieve all metric definitions on the site\n   - Collect all subscriptions/followers data\n   - Gather metrics for each definition\n   - Analyze datasource usage patterns\n   - Calculate statistics and rankings\n\n3. **View Results**: The analytics dashboard displays:\n   - **Summary Cards**: Quick overview of total definitions, metrics, subscriptions, unique followers, certified definitions, and unique datasources\n   - **Top 10 Most Followed Metrics**: Individual metrics ranked by follower count\n   - **Top 10 Definitions by Total Followers**: Metric definitions ranked by aggregate follower count across all their metrics\n   - **Top 10 Datasources by Usage**: Datasources ranked by total followers, showing definition count and metric count\n\n   **Use Cases**:\n   - Understand which metrics and definitions are getting the most adoption\n   - Identify underutilized datasources or definitions\n   - Track certification progress across your organization\n   - Make data-driven decisions about which metrics to promote or retire\n\n### 🔍 Using Zero Follower Metrics\n1. **Server Connection**:\n   - Enter Tableau Server URL and site content URL\n   - Provide authentication credentials (username/password or PAT)\n\n2. **Definition Selection**:\n   - Enter the Pulse Definition ID to analyze\n   - The tool will retrieve all metrics within this definition\n\n3. **Deletion Options (Optional)**:\n   - Check the box to automatically delete metrics with zero followers\n   - ⚠️ **WARNING**: This will permanently delete all non-default metrics that have zero followers\n   - Default metrics cannot be deleted and will be automatically skipped\n\n4. **Execute**: Click \"🔍 Find Zero Follower Metrics\" and view the results\n\n   The tool will:\n   - List all metrics within the definition\n   - Identify which metrics have zero followers\n   - Separate default metrics from scoped metrics\n   - Show metrics with followers for comparison\n   - Optionally delete non-default metrics with zero followers\n   - Display deletion statistics (deleted, failed, skipped)\n\n   **Use Cases**:\n   - Clean up unused scoped metrics that were created but never followed\n   - Identify metrics that may need promotion or removal\n   - Understand metric adoption patterns within a definition\n   - Reduce clutter by removing metrics with no engagement\n\n### 📑 Using Export Definitions\n1. **Server Connection**:\n   - Enter Tableau Server URL and API version\n   - Provide site content URL and authentication credentials\n\n2. **Export Mode Selection**:\n   - **Basic Mode**: Exports essential fields only\n     - Name, Measure, Time Dimension, Definitional Filters, Type, Definition ID, Datasource Name\n   - **Verbose Mode**: Exports all configuration details including:\n     - All basic fields plus Description, Datasource info, Running Total setting\n     - Extension options (Allowed Dimensions, Granularities, Offset settings)\n     - Representation options (Number Format, Sentiment Type, Units)\n     - Insights settings, Comparisons, Certification status\n     - Related Links count, Goals count, Created/Modified timestamps\n\n3. **Execute**: Click \"📑 Export Definitions\" and wait for processing\n\n4. **View \u0026 Download Results**:\n   - Preview the first 50 definitions in an interactive table\n   - Click \"📥 Download CSV\" to get the complete tab-delimited file\n   - File is also automatically saved to the server directory\n\n   **Note on Viz State Definitions**:\n   - Definitions created from existing visualizations show \"(Viz State)\" for Measure, Time Dimension, and Filters\n   - These values are embedded in the visualization and cannot be extracted separately\n   - All other fields (verbose mode) are exported normally\n\n## 🔌 API Endpoints\n\n- `GET /` - Main utilities selection interface\n- `GET /api/hello` - Test API connection endpoint\n- `POST /copy-definitions` - Copy pulse definitions between sites\n- `POST /manage-followers` - Bulk add/remove followers from metrics\n- `POST /swap-datasources` - Copy definitions with new datasources\n- `POST /update-preferences` - Update user preferences for Pulse\n- `POST /check-certified-metrics` - Check certified metrics and remove unauthorized certifications\n- `POST /bulk-create-scoped-metrics` - Create multiple scoped metrics from a source metric\n- `POST /pulse-analytics` - Generate comprehensive analytics about Pulse usage\n- `POST /zero-follower-metrics` - Find and optionally delete metrics with zero followers\n- `POST /export-definitions` - Export all metric definitions to CSV\n\n## Customization\n\n- **Modify the UI:** Edit `templates/index.html` to change the interface or styling\n- **Update CSS:** Modify the styles in the `\u003cstyle\u003e` section for custom themes\n- **Add new API endpoints:** Extend `app.py` with additional `@app.route()` functions\n- **Change server configuration:** Modify the `port=3000` parameter in `app.run()` in `app.py`\n- **Adjust API version:** Update the `API_VERSION` constant in `app.py` if needed\n\n## Development\n\n- The app runs in debug mode by default, so changes to Python files will automatically reload the server\n- For production deployment, set `debug=False` in `app.run()`\n- All sensitive credentials are handled securely and not stored permanently\n\n## Stopping the Application\n\n- Press `Ctrl+C` in the terminal where the server is running\n- To deactivate the virtual environment: `deactivate`\n\n## Troubleshooting\n\n### Common Issues\n\n- **Port already in use:** Change the port in `app.py` or kill the process using port 3000\n- **Module not found:** Make sure you've activated the virtual environment and installed requirements\n- **Permission errors:** Ensure you have proper permissions in the project directory\n\n### API-Related Issues\n\n- **Authentication failed:** Verify your credentials and ensure the server URLs are correct\n- **Datasource not found:** Check that the datasource name exists on the specified site\n- **Definition copy failed:** Ensure you have appropriate permissions on both source and destination sites\n- **Network timeout:** Check network connectivity to the Tableau servers\n\n### Security Notes\n\n- Never commit credentials to version control\n- Use environment variables for production deployments\n- Ensure HTTPS is used for production Tableau Server connections\n- Personal Access Tokens are recommended over username/password authentication\n\n## 🎯 What's Included\n\nThis application suite includes nine powerful utilities for managing Tableau Pulse:\n\n### Available Utilities:\n1. **Pulse Definition Copier** - Copy definitions between sites\n2. **Bulk Manage Followers** - Add/remove followers from metrics  \n3. **Swap Datasources** - Copy definitions with new datasources\n4. **Update User Preferences** - Update Pulse user preferences\n5. **Check Certified Metrics** - View and manage metric certifications\n6. **Bulk Create Scoped Metrics** - Create multiple scoped metrics with dimension filters\n7. **Pulse Analytics** - Get comprehensive insights into metric usage and follower engagement\n8. **Zero Follower Metrics** - Find and optionally delete metrics with no followers\n9. **Export Definitions** - Export all metric definitions to CSV for documentation\n\n### Benefits of the Web Interface:\n- **🌐 No CLI Required**: Everything runs through the web browser\n- **👁️ Better UX**: Visual progress tracking and comprehensive error reporting\n- **✅ Validation**: Form validation ensures all required fields are completed\n- **🔒 Security**: Credentials are handled securely without persistent storage\n- **🚀 Enhanced Functionality**: Same power as the original CLI scripts with improved usability\n- **📱 Accessibility**: Works on any device with a web browser\n- **🏠 Unified Interface**: All nine utilities in one convenient location\n\n### Technical Features:\n- Modern Flask web framework\n- RESTful API design\n- Real-time progress updates via JSON responses\n- Comprehensive error handling and logging\n- Beautiful, responsive UI with animations\n- Support for both JSON and XML API authentication methods\n\nTransform your Tableau Pulse management workflow with this powerful web application suite! 🚀📊👥🔄⚙️✅📊📈🔍📑\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftableau%2Fpulse-api-utilities","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftableau%2Fpulse-api-utilities","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftableau%2Fpulse-api-utilities/lists"}