# Automated Import API Reference Source: https://help.broadstripes.com/api/automated-import-api-reference Technical specifications and examples for the Automated Import API This page provides technical specifications for implementing automated data imports via the Broadstripes API. ## API Endpoints | Environment | URL | | -------------- | ------------------------------------------------------- | | **Production** | `https://crm.broadstripes.com/api/automated_imports` | | **Staging** | `https://groton.broadstripes.com/api/automated_imports` | ## HTTP Specifications ### Request Method **POST** - All automated import requests must use the POST method ### Authentication Include your authentication token in the HTTP header: ``` x-broadstripes-authentication-token: your-authentication-token-here ``` ### Content Types #### For CSV Data * **Content-Type**: `multipart/form-data` * **Content-Disposition**: `form-data; name="automated_import[source_document]"; filename="your-file.csv"` #### For JSON Data * **Content-Type**: `application/json` * **Content-Disposition**: Not required (or use `application/json`) ## Request Examples ### CSV Import with curl ```bash theme={null} curl https://crm.broadstripes.com/api/automated_imports \ -F 'automated_import[source_document]=@/path/to/your-file.csv' \ -H "x-broadstripes-authentication-token: your-authentication-token" \ -X POST ``` ### JSON Import with curl ```bash theme={null} curl https://crm.broadstripes.com/api/automated_imports \ --json '[{"first_name": "John", "last_name": "Smith", "employer": "Acme Inc"}]' \ -H "x-broadstripes-authentication-token: your-authentication-token" \ -X POST ``` ## Response Format ### Success Response **Status Code**: `200` **Response Structure**: ```json theme={null} { "automated_import": { "id": "unique-import-id", "status": "scheduled", "filename": "your-file.csv" // or NULL for JSON imports } } ``` ### Error Responses The API will return appropriate HTTP status codes and error messages for: * Invalid authentication tokens * Malformed data * Configuration issues * Server errors ## Code Examples ### Ruby CSV Import ```ruby theme={null} require 'uri' require 'net/http' file_path = '/path/to/your-file.csv' uri = URI.parse('https://crm.broadstripes.com/api/automated_imports') boundary = "AaB03x" post_body = [] post_body << "--#{boundary}\r\n" post_body << "Content-Disposition: form-data; name=\"automated_import[source_document]\"; " post_body << "filename=\"#{File.basename(file_path)}\"\r\n" post_body << "Content-Type: text/csv\r\n" post_body << "Content-Transfer-Encoding: binary\r\n" post_body << "\r\n" post_body << File.read(file_path, :mode => 'rb') post_body << "\r\n--#{boundary}--\r\n" http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.read_timeout = 600 request = Net::HTTP::Post.new(uri.request_uri) request.body = post_body.join request['Content-Type'] = "multipart/form-data, boundary=#{boundary}" request['x-broadstripes-authentication-token'] = "your-authentication-token" response = http.request(request) ``` ### Ruby JSON Import ```ruby theme={null} require 'uri' require 'net/http' require 'json' # Array of records to import post_json = [ { "first_name" => "John", "last_name" => "Smith", "employer" => "Acme Inc", "department" => "Assembly" } ].to_json uri = URI.parse('https://crm.broadstripes.com/api/automated_imports') json_headers = { "Content-Type" => "application/json", "x-broadstripes-authentication-token" => "your-authentication-token" } http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.read_timeout = 600 response = http.post(uri.path, post_json, json_headers) ``` ## Data Format Requirements ### CSV Format * **Headers Required**: First row must contain field names * **Field Names**: Must match Broadstripes field names exactly * **Encoding**: UTF-8 recommended * **File Size**: No explicit limit, but consider timeout settings ### JSON Format * **Structure**: Array of objects, where each object represents one record * **Field Names**: Must match Broadstripes field names exactly * **Data Types**: Use appropriate JSON data types (strings, numbers, booleans) ### Field Name Examples Common field names that map to Broadstripes: * `first_name`, `last_name` * `employer`, `department` * `address1`, `address2`, `city`, `state`, `zip` * `phone`, `email` * Custom field names (must match exactly as configured in your project) ## ZIP File Support (CSV Only) For CSV imports, you can send a ZIP file containing multiple CSV files with specific names: 1. `people_modifications.csv` 2. `address_modifications.csv` 3. `phone_modifications.csv` 4. `employment_modifications.csv` Files are processed in the order listed above. ## Best Practices ### Performance * **Batch Size**: Consider breaking large datasets into smaller batches * **Timeout**: Set appropriate timeout values (example shows 600 seconds) * **Retry Logic**: Implement retry mechanisms for failed requests ### Security * **HTTPS Only**: Always use HTTPS endpoints * **Token Security**: Keep authentication tokens secure and rotate them regularly * **Data Validation**: Validate data before sending to reduce errors ### Error Handling * **Check Response Codes**: Always verify the HTTP response status * **Parse Error Messages**: Handle and log API error responses appropriately * **Monitor Import Status**: Use the web interface to monitor import progress and results ## Rate Limits While not explicitly documented, consider implementing reasonable delays between requests to avoid overwhelming the API. Monitor your import success rates and adjust timing as needed. ## Testing Always test your integration against the staging environment before using production: * Use the staging URL for initial development * Test with small datasets first * Verify data appears correctly in the Broadstripes interface * Confirm your authentication tokens work properly # Setting Up Automated Import Configuration Source: https://help.broadstripes.com/api/automated-import-configuration Configure and test your automated data import settings Before you can start importing data automatically, you need to create an automated import configuration that defines how your data should be processed. ## Creating Your Configuration ### Accessing the Configuration Page 1. Open the **Settings** dropdown in the upper right corner of the Broadstripes screen 2. Scroll to and select **"Automated import configurations"** 3. On the configuration page, click **"New Configuration"** ### Configuration Options When creating your configuration, you can choose from the following settings: #### Basic Settings * **Type**: Choose between "General CSV" or "General ZIP" * **User account**: Select the user that the imports will be associated with * **Active**: Check to indicate the configuration is active and ready to receive data #### Data Processing Rules * **What should we do with records that don't match?** * **Add**: Create new records for unmatched data * **Skip**: Ignore unmatched records * **New employment at same employer as existing employment should:** * **Update**: Replace existing employment information * **Append**: Add new employment while keeping existing * **When importing addresses, phones or emails:** * **Append**: Add new items alongside existing contact information * **Replace**: Replace all existing contact information with imported data ### Getting Your Authorization Token After saving your configuration, you'll be able to: 1. View the generated **authorization token** 2. Copy it to your clipboard for use in API calls This token is essential for authenticating your automated import requests. ## Testing Your Import Configuration Always test your automated import setup before using it in production. This helps ensure your data will be processed correctly. ### Manual Testing Process The best way to test your automation is to run a manual import that mirrors your automated setup: 1. **Upload Test Data** * Create a test CSV file with a few rows of dummy data * Use the same headers you plan to use in your automation * Keep the dataset small for quick testing 2. **Use Default Mappings** * Don't change any field mappings from the defaults * This is crucial because automated imports can't customize mappings 3. **Match Configuration Settings** * Set the options in the "Configuration" panel to match your automated import configuration exactly * This ensures the test mirrors production behavior 4. **Run the Test** * Click **"Preview"** to see how your data will be processed * When the preview looks correct, click **"Schedule import"** * Review the completed import results 5. **Validate Results** * The manual import results should mirror what will happen with automation * Check that records are created/updated as expected * Verify that data mapping worked correctly ### What to Look For During testing, pay attention to: * **Field Mapping**: Do your CSV headers map correctly to Broadstripes fields? * **Data Quality**: Are values being imported into the correct fields? * **Matching Logic**: Are existing records being updated or new ones created as expected? * **Employment Handling**: Is employment information being processed correctly? * **Contact Information**: Are addresses, phones, and emails being handled as configured? ## Monitoring Your Imports ### Viewing Import History Project admins can monitor automated imports on the project's Automated Imports page: ``` https://crm.broadstripes.com/project-nickname/automated_imports ``` This page shows: * Import status and completion times * Number of records processed * Any errors or warnings that occurred * Links to detailed import results ### Import Status Indicators * **Scheduled**: Import is queued for processing * **Processing**: Import is currently running * **Completed**: Import finished successfully * **Failed**: Import encountered errors ## Best Practices 1. **Start Small**: Test with small datasets before scaling up 2. **Monitor Regularly**: Check the automated imports page for any issues 3. **Keep Configurations Simple**: Use clear, consistent field naming 4. **Document Your Setup**: Keep notes about your configuration choices 5. **Regular Testing**: Periodically test your automation to ensure it's working correctly ## Next Steps Once your configuration is set up and tested: * [Review the API specifications](/api/automated-import-api-reference) for technical implementation details * Begin sending data to your automation endpoint * Monitor imports regularly to ensure continued success # Automated Import Overview Source: https://help.broadstripes.com/api/automated-import-overview Set up automated data import processes for your Broadstripes projects The Broadstripes Automated Import system allows you to automatically import data into your projects via HTTP POST requests, supporting both CSV and JSON formats. ## Target Audience Broadstripes users with Project Admin permissions. ## What is Automated Import? Automated Import enables you to set up recurring or programmatic data imports for a particular Broadstripes project or set of projects. A Broadstripes "project" is typically matched with one union local or organizing campaign, and each project can have multiple automated import configurations. ## Process Overview Setting up automated imports involves four main steps: ### 1. Create an Automated Import Configuration A Broadstripes user with admin permissions creates a new "automated import configuration" in the system. This generates an **authorization token**, which is essential for securely delivering data to be imported. ### 2. Choose Your Data Format Data can be delivered via HTTPS POST in either format: * **Comma-separated values (CSV)** * **JavaScript Object Notation (JSON)** ### 3. Test the Automation Your data will be processed using the same rules as a manual import with the settings you specify. It's crucial to test the data format before production use to ensure everything works as expected. ### 4. Release to Production Once you're satisfied with test results, the automated process can go live. ## Supported Data Formats ### CSV Format Options When delivering CSV data, you have two approaches: **Option 1: Single CSV File** * Provide one CSV file with headers on the first line * Can contain any data valid for import * Simplest approach for most use cases **Option 2: ZIP File with Multiple CSV Files** * Useful when extracting from structured databases * Must contain specifically named files processed in order: 1. `people_modifications.csv` 2. `address_modifications.csv` 3. `phone_modifications.csv` 4. `employment_modifications.csv` ### JSON Format * Send data as JSON-encoded text * Each record represented as a hash/object in an array * More flexible for programmatic integrations ## Key Differences from Manual Imports Automated imports have some important differences from manual imports: 1. **Automatic Field Mapping**: Header names must automatically map to Broadstripes fields - you cannot customize mappings 2. **Default Match Settings**: The system uses current default match checkbox settings 3. **Auto-Create Organizations**: The "Automatically create shops and departments and link employments" setting is always enabled 4. **No Preprocessing**: Data preprocessing steps don't occur in automated imports ## Next Steps * [Set up your import configuration](/api/automated-import-configuration) * [Review the API specifications](/api/automated-import-api-reference) * Learn about testing your imports before going live # Search API Source: https://help.broadstripes.com/api/search-api Retrieve contact data from your Broadstripes project via HTTP requests The Broadstripes Search API allows you to retrieve data from a project via HTTP request, whether generated by a shell program such as curl or a scripting language. ## Target Audience Broadstripes users with Project Admin permissions. ## API Overview The API provides two kinds of data: * **Contact Details**: A JSON array of specific attributes for a list of contacts matching your Broadstripes query * **Contact Counts**: A simple count of contacts matching your query ## Prerequisites To make successful API calls, you need two unique identifiers: 1. **Authentication Token** - Specific to your user account 2. **Project ID** - The ID for the project you're working with (API calls are project-specific) ### Getting Your Credentials Both identifiers can be obtained from the Broadstripes interface: 1. Click the **Settings** dropdown in the upper right corner 2. Choose **"Your project settings"** 3. At the top of the page, you'll see both IDs with copy-to-clipboard icons ## Retrieving Contact Details ### Basic Request Structure Here's a sample curl command that retrieves name data for people employed by "Acme Inc": ```bash theme={null} curl -G -H "X-Broadstripes-Authentication-Token: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \ -d "project_id=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" \ -d "q=employer%3d%22Acme%20Inc%22" \ -d "fields%5B%5D=name" \ "https://crm.broadstripes.com/api/contacts" ``` ### Request Parameters Explained * **`-G`**: Tells curl to send data as part of the URL query string with GET method * **`-H "X-Broadstripes-Authentication-Token"`**: Authentication header with your API token * **`-d "project_id=..."`**: Your project ID as a query parameter * **`-d "q=..."`**: URL-encoded search query using Broadstripes search language * **`-d "fields[]=..."`**: Specifies which fields to return in the response * **API Endpoint**: `https://crm.broadstripes.com/api/contacts` ### Available Fields You can request data from the following fields: * **`name`**: The name fields of the contact * **`events`**: Events associated with the contact * **`relationships`**: Information about the contact's relationships * **`custom fields`**: Custom fields configured in your project. Field matching is case-insensitive. * Example: `fields%5B%5D=Signed%20Card` * **`external system IDs`**: [External system](/docs/project-settings/external-systems-settings) values stored on contacts. Use the system's key name, which follows the format: system name in lowercase, spaces replaced with underscores, followed by `_id`. Field matching is case-insensitive. * **`code`** (alias: **`assessment`**): The contact's current [assessment code](/docs/admin-guides/data-tools/assessment-codes). Use whichever name your project uses for the assessment scale — `code` and `assessment` are interchangeable, and matching is case-insensitive. If a contact has not been assessed, the field returns `null`. #### Retrieving assessment / code values Here's a sample curl command that retrieves the name and current assessment for people employed by "Acme Inc": ```bash theme={null} curl -G -H "X-Broadstripes-Authentication-Token: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \ -d "project_id=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" \ -d "q=employer%3d%22Acme%20Inc%22" \ -d "fields%5B%5D=name" \ -d "fields%5B%5D=assessment" \ "https://crm.broadstripes.com/api/contacts" ``` Use this when you want to export current assessment data to another system, build dashboards on top of organizing progress, or reconcile assessments with an external database. Whether you request `code` or `assessment` does not change the response — the value returned is the contact's current assessment on the project's scale. #### External system key name examples | External System Name | Key Name for API | | -------------------- | ---------------------- | | VAN | `van_id` | | Acme System | `acme_system_id` | | National Database | `national_database_id` | #### Retrieving external system IDs Here's a sample curl command that retrieves name and VAN ID for people employed by "Acme Inc": ```bash theme={null} curl -G -H "X-Broadstripes-Authentication-Token: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \ -d "project_id=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" \ -d "q=employer%3d%22Acme%20Inc%22" \ -d "fields%5B%5D=name" \ -d "fields%5B%5D=van_id" \ "https://crm.broadstripes.com/api/contacts" ``` If a contact does not have a value for the requested external system, the field returns `null` in the response. ### URL Encoding for Search Queries When using Broadstripes search language in URLs, you must convert operators and special characters to URL-encoded strings: | Operator | URL Encoded | Query Example | URL Encoded Query | | -------- | ----------- | ---------------------------- | ------------------------------------ | | = | %3D | field=value | field%3Dvalue | | != | %21%3D | field!=value | field%21%3Dvalue | | > | %3E | field>value | field%3Evalue | | >= | %3E%3D | field>=value | field%3E%3Dvalue | | : | %3A | field:value | field%3Avalue | | \< | %3C | field\ Broadstripes Call Script Syntax (BCSS) is a simple, node-based scripting language that lets you create conversation flows without programming knowledge. Think of it like creating a flowchart where each box (node) represents a point in the conversation. Script flowchart The script editor will automatically create a flowchart of your script as you build it. This flowchart will help you visualize the conversation flow and make sure your script makes sense. You can view the flowchart by clicking the "Flowchart" button in the top right corner of the script editor. Flowchart ### Where to create call scripts Project admins create call scripts on the Call Center settings page. To get to the Call Center settings page: 1. Click the **Project settings** icon in the upper right corner of any page (or press **Ctrl-K** / **⌘K**) 2. Choose **Scripts** 3. Then click the **+ New Call Script** button to start a new script Scripts tab in Call Center settings, with the New call script button at the top right and a list of existing scripts; each row has a ••• menu next to the name for editing or deleting Now that you're in the call script editor, you can start creating your script. First, let's look at the basic structure of a call script and the different elements that make up a call script. ### Script structure Every script consists of: 1. **Nodes**: Individual screens or conversation points 2. **Prompts**: Text displayed to the caller 3. **Buttons**: Options the caller can click to move through the script 4. **Transitions**: Connections between nodes 5. **Data collection**: Custom fields, event steps, or outcomes ### Basic BCSS syntax **NODE** - Defining a page in the call script ```ruby theme={null} NODE NodeName PROMPT Your message here BUTTON Button Text TARGET NextNode ``` **Example**: ```ruby theme={null} NODE Start PROMPT Hi {{person.first_name}}, this is {{caller.name}} from the union. Do you have a moment to talk? BUTTON Yes TARGET Survey BUTTON No TARGET Callback ``` **PROMPT** - Displaying text to callers Prompts can include HTML formatting and variables: ```ruby theme={null} PROMPT

Hi {{person.first_name}}, this is {{caller.name}} calling from Local 123.

PROMPT

According to our records, you work at {{person.employer}}.

``` **BUTTON** - Creating navigation options Buttons let callers move through the script: ```ruby theme={null} BUTTON Yes, I'm interested TARGET InterestedNode ``` You can have multiple buttons in a single node: ```ruby theme={null} NODE Start PROMPT Would you like to participate? BUTTON Yes TARGET Participate BUTTON No TARGET NoThanks BUTTON Maybe later TARGET Callback ``` You can also use `BUTTON` to check off event steps. To check off an event step, use the following syntax: ```ruby theme={null} BUTTON button label EVENT STEP event name : event step name TARGET NextNode ``` **Example**: ```ruby theme={null} BUTTON I will attend EVENT STEP Outreach Event : Attending TARGET Confirm location BUTTON I will not attend EVENT STEP Outreach Event : Not Attending TARGET Goodbye BUTTON Maybe EVENT STEP Outreach Event : Maybe TARGET Follow-up ``` **OUTCOME** - Custom labeled completion button Mark a call as complete with a custom button label: ```ruby theme={null} NODE Success PROMPT Great! We'll be in touch soon. BUTTON Call Back Later OUTCOME Call Later TARGET Goodbye ``` The text after `OUTCOME` will be the outcome recorded on the person's contact timeline. Outcomes that are listed in the **Completed Outcomes** field of the Call Center settings page are not queued to be called again in a random pool using the same call script. **Completed Outcomes** mark calls as finished and prevent people from being called again with the same script. You define these on the **Other settings** tab of the Call Center settings page. Completed Outcomes field When setting up your outcomes, distinguish between two types: * **Add to "Completed Outcomes"**: Outcomes that mean "don't call again" (e.g., "Already Voted", "Not Eligible", "Declined") * **Don't add to "Completed Outcomes"**: Outcomes that mean "try again" (e.g., "Left Voicemail", "No Answer", "Call Back Later") A caller may potentially select several outcomes as they progress through the call/script. The last outcome selected will be the one recorded on the person's contact timeline. **NEXT** - Automatic progression `NEXT` automatically moves to another node with a Continue button: ```ruby theme={null} NODE ThankYou PROMPT Thank you for your time! NEXT GoodbyeNode ``` **CONDITION** - Branching logic Use conditions to personalize conversations based on data: ```ruby theme={null} CONDITION CheckMembership WHEN {{#or (eq person.custom_fields.[status text] "Active") (eq person.custom_fields.[status text] "On Leave") }}true{{/or}} THEN ActiveMembersNode WHEN {{#eq person.custom_fields.[status text] "Contingent" }}true{{/eq}} THEN ContingentMembersNode ELSE RetireesNode ``` **CUSTOM FIELD** - Collecting data with the call center script Custom fields are the most flexible way to collect data during calls. ##### Field types **Text Fields**: * Free-form text entry * Best for: Comments, notes, open-ended answers * Example: "What's your biggest workplace concern?" **Dropdown Fields**: * Predefined options * Best for: Standardized responses * Example: "Shift: Morning, Afternoon, Night" **Checkbox Fields**: * True/false, yes/no * Best for: Binary questions * Example: "High risk worker" **Number Fields**: * Numeric values only * Best for: Counts, amounts, ratings * Example: "Years of service" **Date Fields**: * Best for: Dates of events, follow-ups * Example: "Preferred callback date" Multi-select fields are not supported in the call center. This includes multi-select dropdowns and sortable lists. Collect information during the call: ```ruby theme={null} NODE CollectInfo PROMPT What's your biggest workplace concern? CUSTOM FIELD REQUIRED WorkplaceConcern BUTTON Continue TARGET NextStep ``` The `REQUIRED` keyword means the caller must fill in the field before proceeding. **END** - Auto "Call Complete" Button `END` creates an exit node with an automatic "Call complete" button: ```ruby theme={null} NODE Goodbye PROMPT Thank you for your time. Have a great day! END ``` **OUTCOME** - Recording call outcomes Record the result of a call on the person's contact timeline.: ```ruby theme={null} NODE Success PROMPT Great! We'll be in touch soon. BUTTON Call Back Later OUTCOME Call Later TARGET Goodbye ``` The text after `OUTCOME` will be the outcome recorded on the person's contact timeline. A caller may potentially select several outcomes as they progress through the call/script. The last outcome selected will be the official outcome of the call and will be recorded on the person's contact timeline. **CALL COMPLETE** - Custom labeled completion button Mark a call as complete with a custom label END button: ``` NODE Success PROMPT Great! We'll be in touch soon. CALL COMPLETE Thank You ``` The text after `CALL COMPLETE` becomes the button label. **DEAD END** - Blocking Call Completion Sometimes you need to end a script path without allowing immediate call completion: ``` NODE CannotVote PROMPT We're sorry, but inactive members cannot vote at this time. DEAD END ``` `DEAD END` hides the "Call complete" button and forces the caller to go back to the previous node, skip the person or click "Call interrupted". **SMS MESSAGE** - Sending text messages Your project must have: * At least one active virtual SMS phone number * SMS-capable numbers (not all phone numbers support SMS) #### Including SMS in Scripts Add `SMS MESSAGE` to any node: ```ruby theme={null} NODE SendReminder PROMPT Can we send you a text reminder about the meeting? SMS MESSAGE Hi {{person.first_name}}! Meeting Thursday 6pm at Local 123 Hall. See you there! BUTTON Continue TARGET NextNode ``` #### Message guidelines **Length**: Keep messages under 160 characters when possible (standard SMS length) **Content**: * Include the union name so they know who's texting * Be specific about action items (date, time, location) * Make it personal with variables and merge fields **Good Example**: > "Hi Maria! Local 123 meeting Thursday 6pm at 100 Main St. Bring your questions!" **Bad Example**: > "Meeting Thursday" **Merge fields** Use merge fields to include unique IDs in links: ```ruby theme={null} SMS MESSAGE Verify your voter registration: https://vote.org/verify/%VoterFile-ID% ``` Requirements: * External system or custom field must have "Messaging merge token" enabled * Person must have a value in that external system or custom field * Token format: `%SystemName-ID%` *** **Troubleshooting SMS** **"No outgoing SMS number available"**: * Project doesn't have active virtual SMS numbers * Contact project admin immediately **"Unable to send message"**: * Network connectivity issue * Person's number may not support SMS * Try again or skip SMS step **Person doesn't have cell phone**: * System shows message: "No cell phone available" * Can't send SMS to landlines * Skip the SMS step and continue **BCSS Variables** Scripts can display personalized information using these variables: **Person Information** * `{{person.first_name}}` - First name (e.g., "Maria") * `{{person.last_name}}` - Last name (e.g., "Garcia") * `{{person.name}}` - Full name (e.g., "Maria Garcia") **Caller Information** * `{{caller.name}}` - The person making the call **Employment Information** * `{{person.employer}}` - Main employer * `{{person.department}}` - Department or specific worksite * `{{person.job_title}}` - Job title or classification **Custom Fields** * `{{person.custom_fields.[field_name text]}}` - Any custom field value (the field name must be lower case and followed by the word "text") * Example: `{{person.custom_fields.[shift text]}}` displays the shift custom field **Event Steps** * `{{person.event_steps.[event_name : step_name]}}` - Event step status * Example: `{{person.event_steps.[One-on-One : Completed]}}` shows if the step is checked (this will return true or false) **External Systems (for merge tokens in SMS)** * `%ExternalSystemName-ID%` - In SMS messages only * Example: "Visit [https://vote.org/id/%VoterFile-ID%](https://vote.org/id/%VoterFile-ID%)" * The system replaces the token with the person's external ID ### Script elements in detail **Working with custom fields** Custom fields let you collect project-specific data during calls. To use them: 1. The custom field must exist in your project (**Project settings → Custom fields**) 2. Optionally mark it as "Show in Call Center" for easier access 3. Reference it in your script: ```ruby theme={null} NODE CollectShiftPreference PROMPT What shift would you prefer for the union meeting? CUSTOM FIELD PreferredShift BUTTON Continue TARGET Thanks ``` When the caller reaches this node, they'll see a field to enter the shift preference. **Tips**: * Use `REQUIRED` for critical data: `CUSTOM FIELD REQUIRED MembershipNumber` * Use clear field names that describe what you're collecting * Consider creating dropdown custom fields (using options) for consistency #### Working with event steps Event steps track activities and milestones. Buttons in scripts can automatically check event steps: ```ruby theme={null} NODE MarkInterest PROMPT Great! I'm marking you as interested in joining the organizing committee. BUTTON Continue EVENT STEP OrganizingCommittee : Interested TARGET NextNode ``` You can also create buttons that check multiple event steps or collect event step data as the caller progresses through the script. **Working with assessments** Assessment codes (numbered 0-5) indicate the organizing strength or engagement level of a contact. If your project has "Display assessment in the Call Center" enabled, you can view the current assessment during calls. If your project has "Enable editing of assessment in the Call Center" enabled, you can update the assessment during calls. Common assessment scales: * **0**: Unassessed * **1**: Strong Union supporter * **2**: Union supporter * **3**: Undecided * **4**: Leaning Hostile * **5**: Hostile Display assessment in the Call Center and Enable editing of assessment can be enabled in the Call Center Settings on the **Other settings** tab. ### Supplemental fields Supplemental fields appear at the bottom of every node, regardless of which path the caller took through the script. Define them at the top of your script: ```ruby theme={null} SUPPLEMENTAL CUSTOM FIELD Best phone CUSTOM FIELD Best email CUSTOM FIELD Call Center notes # The "LABEL" instruction below allows you to change the way a custom field is displayed. LABEL Call notes ``` Use comments to provide additional information about the script to other users. Comments are not visible to callers. Start a comment with `#`. *** ## Complete Example Scripts ### Example 1: Union Organizing Outreach with Conditional Routing **Goal**: Contact members about union organizing efforts, collect petition signatures, and recruit volunteers using conditional routing based on member status. ```ruby theme={null} SUPPLEMENTAL # The "supplemental" section identifies (and optionally, allows you to label) custom fields that will appear at the bottom # of every page of the Call Center while a call is going on. CUSTOM FIELD Best phone CUSTOM FIELD Best email CUSTOM FIELD Call Center notes # The "LABEL" instruction below allows you to change the way a custom field is displayed. LABEL Call notes # The script really starts with this first "NODE". As with all nodes, it can be named anything the script-writer likes. # The caller's goal here is to figure whether they've reached the worker. # If they have, they start the pitch. If not, they can click a button to choose one of the other possible call OUTCOMEs. NODE Start PROMPT

Hi, may I speak to {{person.first_name}}?

My name is {{caller.name}}, and I am a [your job title] in [your department]. I'm calling to talk to you about what's going on at {{person.employer}} and about what our union is currently doing to organize and build power.

What have you heard so far about what our union is doing?

BUTTON Reached OUTCOME Reached TARGET Branch on Status BUTTON Left employer OUTCOME Left Employer TARGET Date left employer BUTTON Call back later OUTCOME Call back later TARGET Call back later BUTTON Wrong number OUTCOME Wrong number TARGET Mark phone bad BUTTON No answer or voicemail OUTCOME No answer or voicemail TARGET Send a text NODE Call back later PROMPT

We'll be happy to call another time. What would be best for you?

CUSTOM FIELD Callback time LABEL Best time/date to call back # The "END" instruction below tells the script parser that the call is over. END NODE Send a text PROMPT

If you get voicemail or just no answer, DO NOT LEAVE VOICEMAIL.

If the person you're calling has a cell, send them the following text:

Is this a cell phone number?

Hi, {{person.first_name}}. This is {{caller.name}}. I am a [your title] in [your department]. I'm making calls with other members at our college to find out how people are doing and to let you know about a series of actions the union is taking over the summer to make sure that all of our members keep their jobs and stay safe during the pandemic. Do you have time to talk?
CUSTOM FIELD Phone-bank text sent LABEL Sent a text END NODE Mark phone bad PROMPT

Mark this number as BAD

Please locate the number you dialed in the upper right corner of this panel and click the switch next to it to change the setting from OK to BAD, indicating that the number should no longer be used.

If the person has a second number, please click the Go back button and call that number before marking the call complete.

Otherwise, please click the Call complete button.

END NODE Date left employer PROMPT

Do you know the date you left work?

CUSTOM FIELD Date left employer LABEL Date left NEXT Goodbye CONDITION Branch on Status # The line below uses a special syntax to evaluate the value of the "Status" custom text field on the called worker's record. # NOTE: It's important that the custom field name specified here be in all lowercase, even if the field's name contains capital letters. # Feel free to ask Broadstripes support for help creating such evaluations if you run into difficulties with the syntax. WHEN {{#or (eq person.custom_fields.[status text] "Active") (eq person.custom_fields.[status text] "On Leave") }}true{{/or}} THEN Message to Active Members WHEN {{#eq person.custom_fields.[status text] "Contingent" }}true{{/eq}} THEN Message to Contingent Members ELSE Message to Retirees NODE Message to Active Members PROMPT

Thanks for taking a minute to talk. We're getting in touch with all active members during the pandemic to make sure you're aware of the union's efforts to ensure that our jobs will not be eliminated.

Have you heard about the work the union is doing?

BUTTON Yes TARGET Petition pitch BUTTON No TARGET Retention work details NODE Message to Contingent Members PROMPT

Thanks for taking a minute to talk. We're getting in touch with union members during the pandemic to make sure that you're aware of the union's efforts to ensure that our jobs will not be eliminated.

Before we get to the details, can I ask if you've seen your hours reduced during the pandemic?

BUTTON Yes EVENT STEP Hours Reduced : Yes TARGET Heard about retention work? BUTTON No EVENT STEP Hours Reduced : No TARGET Heard about retention work? NODE Heard about retention work? PROMPT

OK. Have you heard about the work the union is doing to preserve our jobs during the pandemic?

BUTTON Yes TARGET Petition pitch BUTTON No TARGET Retention work details NODE Message to Retirees PROMPT

Thanks for taking a minute to talk. We're getting in touch with our retirees to make sure that you're aware that, despite the pandemic, the union is continuing to work to protect your pension and benefits.

We're also working hard to protect the jobs of current members. Have you heard about this campaign?

BUTTON Yes TARGET Petition pitch BUTTON No TARGET Retention work details NODE Retention work details PROMPT

OK. Let me fill you in quickly about what's going on. The union has been working hard on multiple fronts to make sure that members will still have their jobs when the pandemic is finally over.

Here's some of what's going on:

NEXT Petition pitch NODE Petition pitch PROMPT

To win these battles, the union needs your support.

Would you be willing to sign a petition to the governor and the legislature urging them to approve and sign the job-protecting legislation I mentioned?

BUTTON Will sign EVENT STEP Petition : Yes TARGET Petition info BUTTON Won't sign EVENT STEP Petition : No TARGET Petition feedback # NOTE: Having the NEXT option below gives the caller a "Continue" button that allows them to skip the question. NEXT Goodbye NODE Petition info PROMPT

Later today, I'll send you a link to the petition.

Would you prefer an email or a text?

BUTTON Email EVENT STEP Petition : Email TARGET Ask to Volunteer BUTTON Text message EVENT STEP Petition : Text TARGET Ask to Volunteer NODE Petition feedback PROMPT

Can you tell me what's keeping you from signing the petition?

CUSTOM FIELD Reason won't sign NEXT Goodbye NODE Ask to Volunteer PROMPT

Can you volunteer to help us reach out to more of our members by making calls from home?

BUTTON Yes EVENT STEP Volunteer : Yes TARGET Will volunteer BUTTON No EVENT STEP Volunteer : No TARGET Goodbye NODE Will volunteer PROMPT

Great! Someone from the union will be in touch with you soon about setting you up to call other members.

Thank you for being willing to help support the campaign! Goodbye!

END NODE Goodbye PROMPT

Thank you for your time. It was nice talking to you.

END ``` **Key Features**: * **SUPPLEMENTAL section** with labeled custom fields * **Advanced CONDITION** with OR logic for member status routing * **EVENT STEP** tracking throughout (Hours Reduced, Petition, Volunteer) * **NEXT instruction** for automatic progression with "Continue" button * HTML/CSS styling with colors, bold, lists, and blockquotes * Person variables (`{{person.first_name}}`, `{{person.employer}}`) * Custom field variables in CONDITION (`{{person.custom_fields.[status text]}}`) * Comments explaining script logic * Multiple call outcomes (Reached, Left Employer, Call back later, Wrong number, No answer/voicemail) * Three distinct messaging paths based on member status *** ### Example 2: Basic GOTV Phone Bank **Goal**: Remind voters to vote, confirm their plan, and collect vote intention. ```ruby theme={null} NODE Start PROMPT

Hi {{person.first_name}}, this is {{caller.name}} from Local 123.

Election day is coming up on November 5th. Do you have a moment?

BUTTON Yes, I have time OUTCOME Reached TARGET RemindVote BUTTON Not right now TARGET Callback BUTTON Already voted TARGET AlreadyVoted BUTTON Remove from list TARGET DoNotCall NODE RemindVote PROMPT Great! Have you made a plan to vote on November 5th? BUTTON Yes, I have a plan TARGET ConfirmPlan BUTTON No, not yet TARGET HelpMakePlan BUTTON Not planning to vote TARGET NotVoting NODE ConfirmPlan PROMPT Excellent! Can you share your plan? When will you vote? CUSTOM FIELD REQUIRED VotePlan BUTTON Continue TARGET CheckSupport NODE HelpMakePlan PROMPT Let me help you make a plan. What would work best for you - voting early, voting by mail, or voting on election day? CUSTOM FIELD VoteMethod BUTTON Continue TARGET CheckSupport NODE CheckSupport PROMPT One last question - do you support the union-endorsed candidates? BUTTON Yes, definitely TARGET StrongSupport BUTTON Yes, probably TARGET LikelySupport BUTTON Undecided TARGET Undecided BUTTON No TARGET NoSupport NODE StrongSupport PROMPT

That's great to hear! Thank you for your support.

We'll send you a text reminder before election day.

Can we text you at this number?

SMS MESSAGE Hi {{person.first_name}}! Reminder: Election Day is tomorrow, November 5th. Your vote matters! - Local 123 BUTTON Send reminder OUTCOME Strong Support - Has Plan TARGET Goodbye NODE LikelySupport PROMPT Thank you! If you have any questions about the candidates, visit our website at union.org/vote BUTTON Finish call OUTCOME Likely Support - Has Plan TARGET Goodbye NODE Undecided PROMPT I understand. If you'd like more information about the endorsed candidates, check out union.org/vote BUTTON Finish call OUTCOME Undecided - Has Plan TARGET Goodbye NODE NoSupport PROMPT I appreciate your honesty. Thank you for your time. BUTTON Finish call OUTCOME No Support - Has Plan TARGET Goodbye NODE NotVoting PROMPT I understand. If you change your mind, we're here to help. Have a good day. BUTTON Finish call OUTCOME Not Planning to Vote TARGET Goodbye NODE AlreadyVoted PROMPT That's wonderful! Thank you for voting early. BUTTON Finish call OUTCOME Already Voted TARGET Goodbye NODE Goodbye PROMPT Have a great day! END NODE Callback PROMPT What would be a better time to reach you? CUSTOM FIELD CallbackTime NEXT ThankYou NODE ThankYou PROMPT Thank you! We'll call back at a better time. BUTTON Mark complete OUTCOME Callback Requested TARGET Goodbye NODE DoNotCall PROMPT

I'll make sure we don't call again.

BUTTON Mark complete OUTCOME Do Not Call TARGET Goodbye END ``` **Key Features**: * HTML/CSS styling for emphasis (bold, colors, italics) * Multiple paths based on voter status * SMS MESSAGE for election reminders * Person variables `{{person.first_name}}` * Data collection for vote plans * Clear outcomes for reporting * Callback option for busy voters *** ### Example 3: Member Survey and Issue Identification **Goal**: Identify workplace issues, gauge union support, and recruit organizing committee members. ```ruby theme={null} NODE Intro PROMPT

Hi {{person.first_name}}, this is {{caller.name}} from Local 123.

We're talking to workers at {{person.employer}} in the {{person.department}} department about workplace issues.

Do you have 5 minutes?

BUTTON Yes OUTCOME Reached TARGET MainIssue BUTTON No, call back later TARGET Callback NODE MainIssue PROMPT What's the biggest issue you're facing at work right now? CUSTOM FIELD REQUIRED BiggestIssue BUTTON Continue TARGET RateIssue NODE RateIssue PROMPT On a scale of 1-10, how serious is this issue for you? CUSTOM FIELD REQUIRED IssueSeverity BUTTON Continue TARGET UnionSupport NODE UnionSupport PROMPT Would you support the union taking action on this issue? BUTTON Definitely yes TARGET StrongSupport BUTTON Probably yes TARGET ModerateSupport BUTTON Not sure TARGET Uncertain BUTTON No TARGET NoSupport NODE StrongSupport PROMPT That's great to hear! We're building an organizing committee to address these issues. Would you be interested in joining? BUTTON Yes, I'm interested TARGET CommitteeInterest BUTTON Tell me more TARGET ExplainCommittee BUTTON Not right now TARGET Thanks NODE ModerateSupport PROMPT I understand. Would you be willing to stay informed about union activities? BUTTON Yes TARGET StayInformed BUTTON Maybe TARGET Thanks NODE Uncertain PROMPT That's okay. Many people have questions. Would you like to attend an information meeting? BUTTON Yes TARGET Meeting BUTTON Maybe later TARGET Thanks NODE NoSupport PROMPT I appreciate your honesty. Thank you for your time. BUTTON Mark complete OUTCOME No Union Support TARGET Thanks NODE CommitteeInterest PROMPT Excellent! I'm marking you as interested in the organizing committee. Someone will reach out within a week. CUSTOM FIELD REQUIRED BestContactMethod BUTTON Continue OUTCOME Strong Support - Committee Interest TARGET Thanks NODE ExplainCommittee PROMPT The organizing committee meets weekly to plan actions and build support. It's volunteer-based and we provide training. Interested? BUTTON Yes TARGET CommitteeInterest BUTTON Let me think about it TARGET Thanks NODE StayInformed PROMPT Perfect! We'll keep you updated via email. Can I confirm your email address? CUSTOM FIELD Email BUTTON Continue OUTCOME Moderate Support - Stay Informed TARGET Thanks NODE Meeting PROMPT Great! Our next meeting is Thursday at 6pm at the union hall. Can we send you a reminder? BUTTON Yes, send reminder TARGET SendReminder BUTTON No reminder needed TARGET Thanks NODE SendReminder PROMPT

Perfect! We'll send you the details via text.

Is this the best number to text?

Note: Confirm the phone number before sending.

SMS MESSAGE Hi {{person.first_name}}! Union info meeting Thursday 6pm at Local 123 Hall, 100 Main St. Questions? Reply to this text. - {{caller.name}} NEXT Thanks NODE Thanks PROMPT Thank you so much for your time today. Your voice matters! END NODE Callback PROMPT When would be a better time? CUSTOM FIELD CallbackPreference BUTTON Schedule callback OUTCOME Callback Requested TARGET Thanks ``` **Key Features**: * HTML/CSS styling with colors and emphasis * Custom field variables (`{{person.employer}}`, `{{person.department}}`) * Issue identification and severity rating * Union support assessment * SMS MESSAGE with styling notes for callers * Organizing committee recruitment path * Multiple engagement levels captured *** ### Example 4: New Member Onboarding **Goal**: Welcome new members, collect information, and schedule orientation. ```ruby theme={null} NODE Welcome PROMPT

Hi {{person.first_name}}, this is {{caller.name}} from Local 123.

Welcome to the union!

We're calling all new members at {{person.employer}} to make sure you have everything you need. Do you have a few minutes?

BUTTON Yes OUTCOME Reached TARGET GotCard BUTTON No, call back later TARGET Callback NODE GotCard PROMPT Great! Have you received your union membership card yet? BUTTON Yes TARGET GotHandbook BUTTON No TARGET NoCard NODE NoCard PROMPT We'll make sure one is sent to you right away. Can I confirm your mailing address? CUSTOM FIELD REQUIRED MailingAddress NEXT GotHandbook NODE GotHandbook PROMPT Have you received the new member handbook? BUTTON Yes, I have it TARGET ReadHandbook BUTTON No TARGET SendHandbook NODE SendHandbook PROMPT We can email you a digital copy and mail a printed one. What's your preferred email? CUSTOM FIELD Email NEXT ReadHandbook NODE ReadHandbook PROMPT The handbook covers your rights, benefits, and how the union works. Have you had a chance to look through it? BUTTON Yes, I've read it TARGET Questions BUTTON Not yet TARGET EncourageRead NODE EncourageRead PROMPT I encourage you to review it when you can. It has important information about your rights as a union member. NEXT Questions NODE Questions PROMPT Do you have any questions about your membership or the union? BUTTON Yes TARGET AskQuestions BUTTON No TARGET Orientation NODE AskQuestions PROMPT What questions do you have? CUSTOM FIELD MemberQuestions NEXT AnswerQuestions NODE AnswerQuestions PROMPT [The caller addresses the questions]. Does that help? BUTTON Yes TARGET Orientation BUTTON I have more questions TARGET ScheduleCall NODE Orientation PROMPT We hold new member orientation sessions every month. Would you like to attend? BUTTON Yes TARGET OrientationDetails BUTTON Maybe, tell me more TARGET ExplainOrientation BUTTON No thanks TARGET GetInvolved NODE ExplainOrientation PROMPT Orientation covers how the union works, your rights under the contract, how to file grievances, and ways to get involved. It's about 2 hours and includes dinner. Interested? BUTTON Yes TARGET OrientationDetails BUTTON No thanks TARGET GetInvolved NODE OrientationDetails PROMPT Perfect! Our next orientation is [date] at [time] at the union hall. Can we send you a calendar reminder? BUTTON Yes, by email TARGET EmailReminder BUTTON Yes, by text TARGET TextReminder BUTTON No reminder needed TARGET Committees NODE EmailReminder PROMPT Great! We'll email you the details and a reminder. CUSTOM FIELD Email NEXT Committees NODE TextReminder PROMPT

Perfect! We'll text you a reminder.

Confirm this is the best number: {{person.custom_fields.[best phone text]}}

Note: Update the best phone custom field if needed before sending.

SMS MESSAGE Hi {{person.first_name}}! New member orientation {{person.custom_fields.[orientation date text]}} at Local 123 Hall, {{person.custom_fields.[union hall address text]}}. Dinner provided! - {{caller.name}} NEXT Committees NODE GetInvolved PROMPT No problem! There are other ways to get involved with the union. NEXT Committees NODE Committees PROMPT We have several committees you can join - organizing, political action, social events, and more. Would you like to learn about them? BUTTON Yes TARGET CommitteeInfo BUTTON Maybe later TARGET StayInTouch NODE CommitteeInfo PROMPT Which areas interest you most? BUTTON Organizing new members TARGET OrganizingCommittee BUTTON Political action TARGET PoliticalCommittee BUTTON Social events TARGET SocialCommittee BUTTON I want to learn about all of them TARGET AllCommittees NODE OrganizingCommittee PROMPT The organizing committee works on expanding membership and supporting campaigns. We meet twice a month. Interested? BUTTON Yes TARGET SignUpOrganizing BUTTON Tell me about other committees TARGET PoliticalCommittee NODE SignUpOrganizing PROMPT Excellent! I'm adding you to the organizing committee list. Someone will contact you before the next meeting. CUSTOM FIELD PreferredContactMethod NEXT AnyOther NODE PoliticalCommittee PROMPT The political action committee works on endorsements, voter mobilization, and lobbying. Interested? BUTTON Yes TARGET SignUpPolitical BUTTON Tell me about other committees TARGET SocialCommittee NODE SignUpPolitical PROMPT Great! I'm adding you to the political action committee list. CUSTOM FIELD PreferredContactMethod NEXT AnyOther NODE SocialCommittee PROMPT The social committee plans events, fundraisers, and member gatherings. Interested? BUTTON Yes TARGET SignUpSocial BUTTON No TARGET AnyOther NODE SignUpSocial PROMPT Wonderful! I'm adding you to the social committee list. CUSTOM FIELD PreferredContactMethod NEXT AnyOther NODE AllCommittees PROMPT Perfect! I'm marking you as interested in all committees. Someone from each one will reach out. CUSTOM FIELD PreferredContactMethod BUTTON Sign up OUTCOME New Member - All Committees TARGET StayInTouch NODE AnyOther PROMPT Any other committees you'd like to join? BUTTON Yes TARGET CommitteeInfo BUTTON No, that's all TARGET StayInTouch NODE StayInTouch PROMPT What's the best way to keep you updated about union news and events? BUTTON Email TARGET EmailContact BUTTON Text messages TARGET TextContact BUTTON Phone calls TARGET PhoneContact BUTTON All of the above TARGET AllContact NODE EmailContact PROMPT Can I confirm your email address? CUSTOM FIELD Email NEXT ThankYou NODE TextContact PROMPT Can I confirm your cell phone number? CUSTOM FIELD CellPhone NEXT ThankYou NODE PhoneContact PROMPT Can I confirm your phone number? CUSTOM FIELD PhoneNumber NEXT ThankYou NODE AllContact PROMPT Great! Let me confirm your contact information. CUSTOM FIELD Email CUSTOM FIELD CellPhone NEXT ThankYou NODE ThankYou PROMPT Thank you {{person.first_name}}! Welcome to Local 123. We're glad to have you as a member! END NODE ScheduleCall PROMPT When would be a good time for a longer conversation? CUSTOM FIELD CallbackDateTime BUTTON Schedule call OUTCOME Follow-up Call Needed TARGET ThankYou NODE Callback PROMPT When would be a better time to call? CUSTOM FIELD CallbackTime BUTTON Schedule callback OUTCOME Callback Requested TARGET ThankYou ``` **Key Features**: * Welcome message with HTML/CSS styling * SMS MESSAGE with custom field variables in message * Multiple committee signup paths * Custom field variable usage (`{{person.employer}}`, `{{person.custom_fields.[best phone text]}}`) * Contact preference collection * Progressive engagement strategy *** ### Example 5: Personalized Member Outreach with Conditions **Goal**: Route calls based on member status, department, and previous engagement using advanced CONDITION logic. ```ruby theme={null} NODE Start PROMPT

Hi {{person.first_name}}, this is {{caller.name}} from Local 123.

Do you have a few minutes to talk about what's happening with the union?

BUTTON Yes OUTCOME Reached TARGET CheckStatus BUTTON No, call back later TARGET Callback CONDITION CheckStatus WHEN {{#or (eq person.custom_fields.[member status text] "Active") (eq person.custom_fields.[member status text] "Contingent") }}true{{/or}} THEN ActiveMemberPath WHEN {{#eq person.custom_fields.[member status text] "Inactive" }}true{{/eq}} THEN InactiveMemberPath WHEN {{#eq person.custom_fields.[member status text] "New"}}true{{/eq}} THEN NewMemberPath ELSE GeneralOutreach NODE ActiveMemberPath PROMPT

Great! I see you're an active member at {{person.employer}} in the {{person.department}} department.

We're reaching out about our upcoming contract negotiations.

Your job title is listed as {{person.job_title}} - is that still accurate?

Are you interested in getting involved?

BUTTON Yes, I'm interested TARGET CommitteeSignup BUTTON Tell me more TARGET ExplainCampaign BUTTON Not right now TARGET Thanks NODE InactiveMemberPath PROMPT

Hi {{person.first_name}}, we noticed you haven't been active recently with the union.

We'd love to reconnect!

What's been going on?

BUTTON Work schedule conflicts TARGET ScheduleConflict BUTTON Lost interest TARGET ReengageInterest BUTTON Just haven't had time TARGET TimeConstraints NODE NewMemberPath PROMPT

Welcome {{person.first_name}}!

We're excited to have you as a member. Let me tell you about what we're working on.

NEXT NewMemberInfo NODE GeneralOutreach PROMPT

Thanks for taking my call, {{person.first_name}}.

We're reaching out to members at {{person.employer}} about our current campaign.

Would you like to hear more?

BUTTON Yes TARGET ExplainCampaign BUTTON Not interested TARGET Thanks NODE ScheduleConflict PROMPT I understand. We have flexible ways to stay involved. Would you be interested in attending our next meeting if we could find a time that works for you? BUTTON Yes TARGET ScheduleMeeting BUTTON No TARGET Thanks NODE ReengageInterest PROMPT

I appreciate your honesty.

Things have changed since you were last involved. We're now focused on {{person.custom_fields.[current campaign text]}}.

Does that sound interesting?

BUTTON Yes, tell me more TARGET ExplainCampaign BUTTON No TARGET Thanks NODE TimeConstraints PROMPT I get it—life is busy! We have short-term projects you could help with. Would you be interested in volunteering for just a few hours? BUTTON Yes TARGET VolunteerOpportunities BUTTON No TARGET Thanks NODE CommitteeSignup PROMPT Excellent! We're building a {{person.job_title}} committee to lead our efforts. Would you be interested in joining? BUTTON Yes TARGET LeadershipPath BUTTON Maybe TARGET MoreInfo NODE LeadershipPath PROMPT That's fantastic! I'm marking you as a potential leader. Someone will contact you within 48 hours with details. CUSTOM FIELD leadership interest text BUTTON Confirm interest OUTCOME Leadership Interest TARGET Thanks NODE ExplainCampaign PROMPT

We're working to improve wages, benefits, and working conditions.

Your {{person.department}} department has been particularly vocal about {{person.custom_fields.[department priority issue text]}}.

We'd love your input as someone who works as a {{person.job_title}}.

BUTTON I want to help TARGET CommitteeSignup BUTTON I want to learn more first TARGET MoreInfo BUTTON Not interested TARGET Thanks NODE MoreInfo PROMPT What questions do you have? CUSTOM FIELD questions text BUTTON Continue TARGET AnswerQuestions NODE AnswerQuestions PROMPT [Caller answers based on member's questions]. Does that help clarify things? BUTTON Yes, I'm interested TARGET CommitteeSignup BUTTON I need to think about it TARGET ThinkAbout BUTTON No thanks TARGET Thanks NODE ThinkAbout PROMPT That's completely understandable. Can we follow up in a few days? BUTTON Yes TARGET FollowUp BUTTON No TARGET Thanks NODE FollowUp PROMPT Perfect. What's the best way to reach you? CUSTOM FIELD preferred contact method text BUTTON Schedule OUTCOME Follow-up Scheduled TARGET Thanks NODE VolunteerOpportunities PROMPT Great! We have a data entry project coming up next weekend that would take about 4 hours. Interested? BUTTON Yes TARGET VolunteerSignup BUTTON Tell me about other opportunities TARGET OtherOpportunities NODE VolunteerSignup PROMPT Perfect! I'm signing you up. You'll get details via {{person.custom_fields.[preferred contact method text]}}. BUTTON Confirm signup OUTCOME Volunteer Signup TARGET Thanks NODE OtherOpportunities PROMPT We also need help with phone banking, social media, and event planning. Which interests you? BUTTON Phone banking TARGET PhoneBankingSignup BUTTON Social media TARGET SocialMediaSignup BUTTON Event planning TARGET EventPlanningSignup NODE PhoneBankingSignup PROMPT Excellent! Phone banking is crucial to our campaign. BUTTON Sign up OUTCOME Volunteer - Phone Banking TARGET Thanks NODE SocialMediaSignup PROMPT Great! We need people to help spread the word online. BUTTON Sign up OUTCOME Volunteer - Social Media TARGET Thanks NODE EventPlanningSignup PROMPT Perfect! We're planning several events over the next few months. BUTTON Sign up OUTCOME Volunteer - Event Planning TARGET Thanks NODE ScheduleMeeting PROMPT When would work best for you? CUSTOM FIELD preferred meeting time text NEXT Thanks NODE NewMemberInfo PROMPT We're currently focused on contract negotiations and building member engagement. Would you like to get involved? BUTTON Yes TARGET CommitteeSignup BUTTON Maybe TARGET MoreInfo BUTTON No TARGET Thanks NODE Thanks PROMPT Thank you {{person.first_name}}! We appreciate your time. Feel free to reach out anytime. END NODE Callback PROMPT When would be a better time to reach you? CUSTOM FIELD callback time text BUTTON Schedule callback OUTCOME Callback Requested TARGET Thanks ``` **Key Features**: * **Advanced CONDITION logic**: * Basic CONDITION with simple equality check * OR logic to match multiple member statuses * AND logic to combine multiple conditions (inactive AND not contacted recently) * Extensive HTML/CSS styling throughout prompts * Multiple custom field variables: * Built-in fields (`{{person.employer}}`, `{{person.department}}`, `{{person.job_title}}`) * Custom text fields (`{{person.custom_fields.[member status text]}}`, `{{person.custom_fields.[current campaign text]}}`) * Personalized routing based on member data * Dynamic messaging using person variables * GeneralOutreach ELSE path for unmatched conditions *** ## Troubleshooting ### Script validation errors #### Error: "Node 'NodeName' does not exist" **Cause**: A button's `TARGET` references a node that doesn't exist. **Example**: ```ruby theme={null} BUTTON Continue TARGET NextNode ← NextNode is not defined anywhere ``` **Solution**: 1. Find where the node is referenced 2. Either create the missing node or change the target to an existing node ```ruby theme={null} BUTTON Continue TARGET ThankYou ← Changed to existing node ``` *** #### Error: "Duplicate node name" **Cause**: Two nodes have the same name. **Example**: ```ruby theme={null} NODE Start PROMPT Hi there! NODE Start ← Duplicate! PROMPT Welcome! ``` **Solution**: Rename one of the nodes to be unique. ```ruby theme={null} NODE Start PROMPT Hi there! NODE Welcome PROMPT Welcome! ``` *** #### Error: "Missing PROMPT in node" **Cause**: A node exists without a PROMPT statement. **Example**: ```ruby theme={null} NODE MyNode BUTTON Continue TARGET NextNode ``` **Solution**: Add a PROMPT. ```ruby theme={null} NODE MyNode PROMPT Please answer the question below. BUTTON Continue TARGET NextNode ``` *** ## Creating and Managing Scripts ### Step-by-Step: Creating a Script 1. **Navigate to script page** * Click the **Project settings** icon in the upper right corner of any page (or press **Ctrl-K** / **⌘K**), then choose **Scripts** * Click **New call script** 2. **Name your script** * Enter a descriptive name (e.g., "GOTV 2024", "Member Survey Fall", "Pledge Card Collection") * Use names that make it clear what the script is for 3. **Write your BCSS code** * In the BCSS editor, write your script using the syntax covered above * Start with a simple flow and add complexity gradually * Use the example scripts as templates 4. **Validate your script** * Click **Validate** to check for syntax errors * Fix any errors shown in red * Common errors: * Missing node names * Duplicate node names * Buttons pointing to non-existent nodes * Missing PROMPT in a node 5. **View the flow chart** * Click **Flow Chart** to see a visual representation * This helps identify logic errors or dead ends * Ensure all paths lead to either OUTCOME or DEAD END 6. **Save as draft** * Click **Save** to save your script 7. **Test your script** * Before activating, test the script with a small call pool * Have callers walk through different paths * Collect feedback on clarity and flow *** ## Best practices **1. Start with a clear goal** Before writing a single line, answer: * What information do I need to collect? * What action do I want people to take? * How will I use the outcomes for follow-up? **2. Keep it conversational** Write how you speak: * ❌ "Greetings. I am inquiring as to your availability for union participation." * ✅ "Hi! Do you have a few minutes to talk about union activities?" **3. Respect people's time** * State the purpose upfront * Offer an easy exit ("Is now a good time?") * Keep scripts under 5-10 minutes when possible * Don't collect data you won't use **4. Provide clear options** Every node should have obvious next steps: * ❌ "What do you think?" * ✅ Clear buttons: "Very interested", "Somewhat interested", "Not interested" **5. Plan for all responses** Include paths for: * Enthusiastic supporters * Undecided people * Those who say no * People who want callbacks * Those who ask to be removed from lists **6. Test before launching** * Walk through every possible path * Have a colleague test it * Do a pilot with 5-10 friendly contacts * Fix issues before full rollout **7. Iterate based on feedback** * Debrief with callers after phone banks * Ask what was confusing * Look at where people got stuck (check call duration) * Update scripts between campaigns *** ### Best practices for script design **Keep it conversational** * Write prompts the way you would naturally speak * Avoid overly formal or robotic language * Example: "Hi Maria" not "Greetings, Ms. Garcia" **Provide clear options** * Button text should make the outcome obvious * Bad: "Option A", "Option B" * Good: "Yes, I'm interested", "No, not interested" **Plan for all scenarios** * Include options for "I don't know", "Call me back", "Remove from list" * Don't force people into binary choices when their situation might be more complex **Collect only necessary data** * Every field you add increases call time * Focus on the most important information * You can always follow up later **Use variables to personalize** * Including the person's name and workplace makes the conversation feel more genuine * Example: "Hi `{{person.first_name}}`, this is `{{caller.name}}` from the union" **Test different paths** * Walk through your script as if you were different types of contacts * Ensure positive, negative, and neutral paths all make sense **Plan your outcomes** * Think about how you'll use outcome data for follow-up * Create specific enough outcomes to guide next steps * Example: "Strong Support - Committee Interest" vs just "Completed" ### Managing script versions **Editing active scripts** * You can edit an active script, but changes affect all future calls immediately * If making major changes, consider creating a new version instead **Disabling scripts** * To disable a script, uncheck **Active** in the **Scripts** tab of the Call Center settings page. * Disabled scripts will disable call pools that use them. *** # Using the Call center Source: https://help.broadstripes.com/docs/admin-guides/call-center/using-call-center ## Overview The Broadstripes CRM Call Center is a powerful phone banking system designed specifically for labor organizing campaigns. It enables your team to conduct structured phone conversations with workers, collect data in real-time, track outreach progress, and measure campaign effectiveness—all while maintaining detailed records of every interaction. Call Center Whether you're running a Get Out The Vote (GOTV) campaign, conducting member surveys, collecting pledge cards, or building your organizing committee, the Call Center feature provides the tools you need to run efficient, data-driven phone banks with: ## What you can do with the Call center The Call Center enables you to: * **Run organized phone banks** with customizable conversation scripts * **Collect data during calls** using custom fields, event steps, and assessments * **Track call outcomes** to measure campaign effectiveness * **Send SMS messages** directly from the calling interface * **Manage caller workflows** with random queues or targeted List call pools * **View historical data** about previous calls and interactions * **Handle authentication** for sensitive operations like ratification votes * **Generate reports** on call completion rates, outcomes, and data collected * **Coordinate multiple callers** with automatic call locking to prevent duplicates *** ### Getting Started: Understanding the Call Center Before diving into setup, let's understand the three main components: #### 1. [Scripts](/docs/admin-guides/call-center/creating-call-center-script) Think of a script as a **choose-your-own-adventure guide** for phone conversations. It contains: * Questions to ask * Response options * What to say next based on the answer * Information to collect **Example**: A ratification vote script might ask "Will you vote Yes on the contract?" with buttons for Yes/No/Undecided, then route to different follow-up questions based on the response. #### 2. [Call Pools](/docs/admin-guides/call-center/using-call-pools) A Call Pool is a **list of people to call** plus the configuration for how calling should work. Think of it as: * The contact list (who to call) * The script to use (what to say) * Access rules (who can call, when) * Calling style (random queue vs. choosing from a list) **Example**: "2025 Contract Ratification Pool" containing 500 members, using the "Ratification Script," open from May 1-15. #### 3. [The Caller Interface](/docs/communications/making-calls) This is the **web-based phone banking interface** where callers: * See who to call next * Follow the script * Mark phone numbers as good or bad * Record responses * Move to the next call *** ## Setting up data for the call center ##### Marking fields "Display in Call Center" When you create or edit a custom field, you can check "Display in Call Center": Display in Call Center **Effect**: * Field appears in the header during calls * Callers can see the current value * Helps provide context **Use Cases**: * Display shift information so callers know when the person works * Show previous survey responses * Confirm person via external system IDs You may also mark external systems "Display in Call Center" to display external system IDs during calls. ##### Collecting vs. displaying * **Display only**: Check "Display in call center" but don't include in script * **Collect during call**: Include `CUSTOM FIELD` in script * **Both**: Check "Display in call center" AND include in script (caller can see existing value before updating it) Collecting vs. displaying ##### Assessment codes display and editing Assessment codes rank organizing/support strength (usually on a 0-5 scale). These settings control how assessment codes are displayed and edited in the Call Center (located on the Other Settings tab of the Call Center settings): * **Display code in the Call Center**: Displays current assessment code, read-only * **Enable editing of code in the Call Center**: Allows callers to update assessment codes **When to Use**: * Organizing campaigns where caller judgment matters * Assessing member engagement levels * Identifying leaders and organizers **Best Practices**: * Train callers on what each code means * Provide clear guidelines for updates * Review changes regularly for consistency * Use in conjunction with call outcomes for better tracking *** ## Call locks and concurrency Call locks prevent multiple callers from calling the same person simultaneously. **How it works**: 1. Caller starts a call 2. System creates a lock on that person (lasts 30 minutes) 3. Other callers can't call that person during the lock (not applicable to List call pools) 4. Lock releases when: * Call is completed * Call is skipped * Caller ends session * Project admin manually releases the lock in the call center settings Locks tab in Call Center settings, showing a Locked Calls table with the caller name, person called, lock duration, and script, plus a ••• menu next to each caller for releasing the lock A project admin can manually release a lock on the **Locks** tab in the call center settings. To release a lock, click the **•••** menu next to the caller's name and choose **Delete**. You can also bulk-release locks by checking the boxes next to the rows you want to clear and clicking the **Delete** button at the top of the table. **Why it matters**: * Prevents embarrassing duplicate calls ("Someone else just called me!") * Ensures data integrity (no conflicting updates) * Improves caller efficiency (no wasted time on already-called people) **Handling lock errors**: **In random pools**: * If the next person is locked, system automatically skips to the next available person * Caller doesn't see the lock **In List call pools**: * Locked people display a **Locked** status badge in the Status column * Clicking them shows: "This person is currently being called by another volunteer" * Choose a different person In a List call pool, the lock can be overridden by the caller. *** ## Call Outcomes and Tracking #### Understanding Outcomes Call outcomes categorize how each call ended. They're essential for follow-up, reporting, and measuring campaign effectiveness. ##### Standard Outcomes These are automatically set based on how the call progresses: **"Reached"**: Person answered and participated (generic outcome if script doesn't set a specific one) **"Skipped"**: Caller clicked "Skip this person" **"Interrupted"**: Call was disconnected or interrupted ##### Custom Outcomes Scripts define custom outcomes using `OUTCOME`: ``` NODE Success PROMPT Thank you for your support! BUTTON Will Volunteer OUTCOME Will Volunteer TARGET Schedule Training BUTTON Will Not Volunteer OUTCOME Won't Volunteer TARGET Goodbye ``` The text after `OUTCOME` becomes the outcome. Calls that are marked with a Completed `OUTCOME` are not queued to be called again in a random pool using the same call script. **Completed Outcomes** mark calls as finished and prevent people from being called again in the same random pool. You define these on the **Other settings** tab of the Call Center settings page. Completed Outcomes field When setting up your outcomes, distinguish between two types: * **Add to "Completed Outcomes"**: Outcomes that mean "don't call again" (e.g., "Already Voted", "Not Eligible", "Declined") * **Don't add to "Completed Outcomes"**: Outcomes that mean "try again" (e.g., "Left Voicemail", "No Answer", "Call Back Later") **Plan for follow-up**: Your outcomes should guide next steps: | Outcome | Follow-Up Action | | ---------------------- | -------------------------------- | | Strong Support | Add to organizing committee list | | Undecided - Needs Info | Send informational email | | Callback Requested | Schedule follow-up call | | Do Not Call | Remove from future pools | | Already Voted | No action needed | ##### Outcome reporting Use outcomes to: **Measure campaign success**: * "What percentage of calls resulted in 'Strong Support'?" * "How many pledge cards were collected?" * "What's our GOTV contact rate?" **Segment for follow-up**: * Search for people with outcome "Callback Requested" * Create new pool of people with outcome "Undecided - Needs Info" **Identify issues**: * High "Wrong Number" rate → Need better phone data * Lots of "No Answer" → Try different calling times *** ## Troubleshooting #### Permission issues **Error: "You don't have permission to access call center"** **Cause**: Call Center feature not enabled for the project. **Solution**: Contact Broadstripes support *** **Error: "You don't have permission to create call pools"** **Cause**: User doesn't have **Can manage own call pools** permission. **Solution**: project admin needs to: 1. Click the **Project settings** icon in the upper right corner of any page (or press **Ctrl-K** / **⌘K**) and choose **Members** 2. Edit your user membership 3. Check "Can manage own call pools" 4. Save *** **Problem: "No one available to call"** **Possible causes**: 1. Everyone has been called already 2. Everyone is currently locked by other callers 3. People were removed from the pool **Solutions**: * Check how many people are in the pool * If certain a person should not be locked, contact your project admin to unlock them * Add more people to the pool *** ##### Person locked errors **Error: "This person is currently locked by the call center"** **Cause**: Someone else is calling this person right now, or the lock hasn't expired from a previous call. **Solution**: * **List call pools**: Choose a different person * **Random pools**: System automatically skips to next person * **If it persists**: Contact your project admin (locks can be manually cleared) *** #### Session issues **Problem: "Session timeout"** **Cause**: No activity for extended period (usually 30+ minutes of inactivity). **Solution**: 1. You'll be logged out automatically 2. Click the call pool link again 3. Your caller information should be remembered 4. Start calling again **Prevention**: * Don't leave the page idle for long periods * Complete or skip calls rather than leaving them open * End your session if taking a break *** **Problem: "Lost my place in the script"** **Cause**: Page refresh, browser back button, or navigation error. **Solution**: * Click "Go back" button repeatedly to return to the start * Data entered before the error may be lost **Prevention**: * Avoid using browser back/forward buttons * Use the script's "Go back" button instead * Don't refresh the page during calls *** #### SMS sending problems **Error: "No outgoing SMS number is available"** **Cause**: Project doesn't have any active SMS phone numbers provisioned. **Solution**: * **Immediate**: Skip the SMS portion and continue the call * **Long-term**: Contact project admin to provision a virtual phone number *** **Error: "Unable to send message"** **Possible causes**: 1. Person's number doesn't support SMS 2. Number is landline (no SMS capability) 3. Network connectivity issue **Solution**: * Try one more time * If it fails again, skip the SMS and continue * Make a note that SMS couldn't be sent * Complete the call normally *** **Error: "No cell phone available for SMS"** **Cause**: Person doesn't have a cell phone number in their record. **Solution**: * This is expected behavior * You can't send SMS to landlines * Skip the SMS portion * Continue with the rest of the script *** ## Campaign Optimization **1. Track Key Metrics** Monitor daily: * Contact rate (% of calls where you reach someone) * Completion rate (% of people who go through full script) * Outcome distribution (are you getting the results you want?) * Average call duration (if it's growing, script might be too long) **2. Optimize Calling Times** Test different times: * Weekday evenings (6-8pm) * Weekend mornings (10am-12pm) * Weekend afternoons (1-4pm) Track when you get the best contact rates and adjust. **3. Segment Your Targets** Don't treat everyone the same: * Past supporters get different scripts than cold contacts * Active members vs inactive members * Different departments or worksites might need tailored approaches **4. Follow Up Promptly** Use outcomes to drive follow-up: * Call "Callback Requested" people within 24-48 hours * Email "Wants More Info" people immediately * Move "Strong Support" people to action lists **5. Celebrate Progress** Share results with callers: * "We've contacted 500 people this week!" * "75% of people we've reached support the contract!" * "You collected 50 pledge cards - amazing work!" This keeps volunteers motivated. *** ## Tips for Labor Organizing Use Cases ##### GOTV (Get Out The Vote) Campaigns **Strategy**: * Call 3 times: 1 week out, 3 days out, day before * Use List call pools for known supporters * Use Random pools for broader universe * Focus on vote plan (when, where, how) **Script Tips**: * Lead with election date: "Election day is Tuesday, November 5th" * Confirm voting plan: "What time will you vote?" * Send SMS reminders with polling location * Track who already voted to avoid repeat calls **Metrics to Track**: * % with firm vote plan * % supporting endorsed candidates * % who already voted * Callback success rate *** ##### Member Engagement and Check-Ins **Strategy**: * Regular touchpoints (quarterly or semi-annually) * Build relationships, not just data collection * Identify issues early * Recruit volunteers **Script Tips**: * Start personal: "How have things been at work?" * Ask open-ended questions * Listen more than talk * End with "How can the union help?" **What to Track**: * Workplace issues identified * Member satisfaction trends * Volunteer interest * Communication preferences *** ##### Issue Surveys and Bargaining Prep **Strategy**: * Survey before bargaining begins * Prioritize issues by frequency and intensity * Use data to build bargaining strategy * Report results back to members **Script Tips**: * "What's the most important issue for you?" * "Rate this issue 1-10 in importance" * "Would you support union action on this?" * Collect specific examples and stories **Data to Collect**: * Issue categories (wages, safety, schedule, etc.) * Severity ratings * Willingness to act * Department/worksite breakdowns *** ##### Pledge and Card Collection **Strategy**: * Warm leads first (previous supporters) * Follow up quickly on "yes" responses * Multiple options (in-person, mail, electronic) * Track signatures rigorously **Script Tips**: * Social proof: "Over 60% of your coworkers have signed" * Address concerns immediately * Multiple ask strategy (if no, ask for meeting) * Confirm contact info for follow-up **Track Carefully**: * Who committed to sign * Method (in-person, mail, electronic) * Follow-up needed * Actual signatures received *** ##### Strike Preparation and Mobilization **Strategy**: * Assess support levels * Identify commitments * Build strike teams * Plan communication chains **Script Tips**: * Gauge commitment: "Would you walk a picket line?" * Identify leaders: "Would you help organize others?" * Practical planning: "What shift can you cover?" * Address concerns seriously **Critical Data**: * Strike support levels * Volunteer commitments * Shift coverage availability * Concerns or barriers * Alternative contact methods (in case work numbers don't work) *** ## Frequently Asked Questions **Q: Can I call the same person from multiple pools?** A: Yes. Locks prevent simultaneous calls, but the same person can be in multiple pools (if the scripts are different) and can be called at different times. However, be mindful of over-calling - check call history before adding someone to a new pool. *** **Q: What happens if I accidentally skip someone?** A: They're marked as skipped with outcome "Skipped", but only the caller who skipped them is excluded from reaching them again in the current session. Other callers will still get the person through the Random pool's regular rotation, and the original caller will be eligible to reach them in a later session. In a List call pool, any caller can manually re-select the person right away. *** **Q: Can I pause in the middle of a call and come back later?** A: Not reliably. The session has a timeout (typically 30 minutes of inactivity). If you need a break, complete the current call first, then take your break before starting the next call. *** **Q: How long are call records kept?** A: Indefinitely. All call history, outcomes, and data collected are permanent records. This is important for campaigns that span months or years. *** **Q: What if someone speaks a different language?** A: You can create scripts in multiple languages. Either: 1. Create separate pools by language preference 2. Have bilingual callers who can switch 3. Use conditional logic to offer language choice Example: ``` NODE LanguageChoice PROMPT Hello / Hola BUTTON English TARGET EnglishScript BUTTON Español TARGET SpanishScript ``` *** **Q: Can I see other callers' progress in real-time?** A: Project admins can see overall progress but not live call-by-call details. Privacy and security limit real-time monitoring. Check pool reports for aggregate stats. *** **Q: What happens if two people try to call the same person at exactly the same time?** A: The call locking system handles this. The first person to start the call gets the lock. The second person is either: * Automatically skipped to the next person (Random pools) * Shown a lock icon (List call pools) *** **Q: Can I edit a script while people are using it?** A: Technically yes, but not recommended. Changes take effect immediately and could confuse active callers. Best practice: 1. Create a new version of the script 2. Create new pools with the new script 3. Let existing pools finish with the old script *** **Q: Can I assign specific people to specific callers?** A: Not directly in Random pools, but yes in List call pools. List call pools let callers choose, so you can: 1. Create a List call pool 2. Give different callers different lists/priorities 3. Train them to prioritize certain people *** **Q: What if the script doesn't cover a situation that comes up?** A: Use your judgment: 1. Handle the situation professionally 2. Use supplemental notes to record what happened 3. Complete the call with the closest applicable outcome 4. Report to project admin so the script can be updated **Example**: Person mentions they're moving out of state. There's no script path for this, but you'd: * Thank them for their time * Make a note in supplemental field * Mark as "Other - Moving Out of State" * Report so they can be removed from future campaigns *** **Q: What should I do if I accidentally mark a good number as bad?** A: Click the toggle again immediately to unmark it. If you've already completed the call, contact your project admin - they can correct it in the app. *** # Using call pools Source: https://help.broadstripes.com/docs/admin-guides/call-center/using-call-pools Create and manage call pools for phone bank campaigns, including pool types, status tracking, and scheduling. Call pools are groups of people who will be called using a specific script. Think of them as "phone bank lists" with rules about how people get called. ### Understanding pool types #### Random pools (Default) **How they work**: * System automatically selects the next person for each caller * Each person is called once per caller * People are locked while being called to prevent duplicates * Callers don't see who's next until the call starts **Best For**: * Large-scale outreach where every contact is equally important * GOTV campaigns * General surveys * Situations where you want to prevent caller bias in selecting contacts **Example**: You have 500 members to call for a contract vote. You want each person called exactly once in random order. #### List call pools **How they work**: * Callers see a full list of everyone in the pool * Callers choose who to call from the list * Still includes call locking to prevent duplicates (Caller can override in a List call pool) * List can be sorted and filtered **Best For**: * Targeted calling where caller judgment matters * Follow-up calls * VIP or leadership outreach * Situations where callers need to see context (e.g., previous call outcomes) **Example**: You have 50 shop stewards to call with important updates. Callers know the stewards personally and can prioritize who to reach first. ##### Session metrics dashboard When a caller opens a List call pool, a metrics dashboard appears above the target list. It gives callers a running view of their own activity and the pool's overall progress, so they can see at a glance how the campaign is going while they work. List call pool session metrics dashboard showing the Your calls panel, pool and script names with a progress bar by call status, and the All calls panel The dashboard has three sections: * **Your calls** (left) shows the current caller's activity: * **this session** — calls placed since starting the current session * **today** — calls placed by this caller in this pool today (across all sessions) * **total placed** — calls placed by this caller in this pool, all time * **Pool / Script** (center) names the call pool and call script, and shows a progress bar that breaks the pool down by call status (the same statuses described in the [Call pool status column](#call-pool-status-column) below — Completed, Call back / follow-up, and Call / to call). * **All calls** (right) shows the pool's totals across every caller: * **people** — total people in the pool * **calls placed** — calls placed in this pool by all callers combined * **completed** — calls that reached a completion outcome The metrics are loaded when the page opens and refresh as the session progresses, so reloading the list or returning to it after a break shows the latest numbers. ##### Call pool status column In a List call pool, each person in the list displays a **Status** badge that shows their current call progress. The status is determined by the person's call history with the pool's script. | Status | Description | | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Call** | The person has not been called yet for this script. Click the badge (or the **Start** button on the right) to start the call. | | **Follow-up** | The person has been called, but the call outcome does not match any of the script's configured completion outcomes (e.g., the call went unanswered or needs another attempt). Click the badge to call again. | | **Complete** | The person has been called and the outcome matches one of the script's completion outcomes. This is a non-clickable badge. | | **Locked** | Another caller is currently on the line with this person. This badge clears automatically when the other caller finishes. | By default, the list shows only people with **Call** and **Follow-up** statuses. Use the status filter to show **Complete** or **Locked** people as well. The session metrics dashboard's progress bar (above the list) provides a visual summary of how many people in the pool fall into each status. List call pool view with the session metrics dashboard at the top and the target list below, showing Status badges (Call, Follow-up, Locked) alongside the Start action button and columns for Name, Call script, Department, Job Title, Times, Last called, Last script, and Last call outcome ##### Call history panel The list view also includes a call history panel that shows recent call activity for each contact in the pool. Use it to see at a glance who has been called, when, and what happened — without having to open each contact's full record. For each person in the list, the panel surfaces: * **Recent call attempts** for the pool's script, with the date and time of each attempt * **The outcome** of each call (for example, the response chosen by the caller, whether the call was completed, or whether it needs follow-up) * **The caller** who made the attempt This is especially useful in List call pools where callers choose who to dial next: * **Avoid calling someone twice in a row** by checking whether they were just contacted by another caller. * **Prioritize call-backs** by spotting people whose last attempt did not reach a completion outcome. * **Coordinate across volunteers** so that conversations build on what has already been said rather than starting over. The history panel updates as calls are completed in the pool, so refreshing the list view shows the latest activity. #### Authenticated pools **How they work**: * Additional verification step before calling begins * Used for sensitive or official processes * Can include password protection * Often tied to specific custom fields (like "Ratification Vote") **Best For**: * Contract ratification votes * Officer elections * Sensitive surveys * Any situation requiring verified identity **Example**: Contract ratification vote where each member gets one verified vote recorded. **Reach out to Broadstripes support for more information on authenticated pools.** ### Creating a call pool 1. **Search for people** * Go to **Search** and find the people you want to call * Use search filters to target specific groups * Example: `department:Warehouse shift:Night` 2. **Select people** * Click **Select All** or individually check people 3. **Create pool** * Go to **Communications → Create call pool** 4. **Configure basic settings** * **Call pool name**: Descriptive name (e.g., "Warehouse Night Shift - GOTV Week 1") * **Choose a call script**: Select from your active scripts 5. **Choose pool type** * Check "Allow callers to see pool as list and make calls at will" for List call pool (Leave unchecked for Random pool) 6. **Add password** (Optional) * For restricted access pools * Callers must enter password to start calling 7. **Create pool** * Click **Create call pool** * System generates a unique link 8. **Share the link** * Copy the provided link * Share with your phone bank volunteers ### Edit existing call pools 1. Open the call pool list. Either click **Call pools** () in the left sidebar, or open the settings gear (**Project settings**) in the upper right and choose **Call pools** under **Call Center**. Both open the **Call Center settings** page with the **Pools** tab active. 2. Find the pool you want to edit 3. Click the **•••** menu next to the pool name. Choose **Copy call pool link** to grab the shareable URL, **Edit** to open the pool's edit page, or **Delete** to remove the pool. Call pools tab in Call Center settings, showing the ••• menu next to each pool name with Copy call pool link, Edit, and Delete options You can also delete a call pool by selecting the checkbox next to the pool and clicking the **Delete** button at the top of the page. 4. On the edit page, you may: * Edit the pool name * Disable the call pool * Edit the pool type * Change the call script * Update the password * Set a **Caller page title** and **Caller greeting** (see below) * Set a start and end date for the pool 5. Make your changes and click **Save** Edit call pool **Caller page title** sets the browser tab title callers see when they open your call pool link. Leave it blank to use the default title. This applies to all pool types. **Caller greeting** (authenticated pools only) sets the introductory text shown on the sign-in page above the entry form. Leave it blank to use the default greeting. **Set schedule** (Optional) A project admin can set a start and end date for the pool in the Call Center settings page. This will prevent callers from starting the pool before the start date or ending the pool after the end date. Click edit on the pool's row on the **Pools** tab to set the start and end date. *(Type "Call pools" in the settings gear menu to find it.)* * **Use start date/time**: When the pool becomes available * **Start message**: Shown to callers before the pool opens * **Use end date/time**: When the pool closes * **End message**: Shown after the pool closes * **Time zone**: Important for multi-timezone campaigns ### Adding and removing people from pools **Adding people to an existing pool** 1. Search and select the people you want to add 2. Go to **Communications → Add to call pool** 3. Choose the existing pool from the dropdown 4. Click **Add** 5. The people are immediately available for calling **Use Case**: You created a GOTV pool with 500 people, but then identified 50 more voters who should be included. **Removing people from a pool** 1. Search and select the people you want to remove 2. Go to **Communications → Remove from call pool** 3. Choose the pool 4. Click **Remove** 5. The people are immediately removed (even if currently being called) **Use Case**: Someone already voted early, so you remove them from the GOTV pool. ### Managing multiple call pools You can run multiple pools simultaneously: * **Different scripts**: One pool for GOTV, another for member surveys * **Different target groups**: One pool for members, another for non-members * **Different campaigns**: One pool per worksite or department * **Sequential pools**: Create new pools as campaigns progress **Example setup**: * "GOTV Week 1 - High Priority" (List call pool, 200 people) * "GOTV Week 1 - General" (Random pool, 1,800 people) * "Member Check-in - Warehouse" (Random pool, 500 people) ### Call pool scheduling **Setting start times** **Why use it**: * Coordinate phone banks across time zones * Prevent callers from starting too early * Align with campaign launch times **Example**: * **Start date**: November 1, 2024 * **Start time**: 5:00 PM * **Time zone**: Eastern * **Start message**: "Thank you for volunteering! This phone bank opens at 5pm Eastern time. Please return after 5pm to begin calling." **Setting end times** **Why use it**: * Respect calling hours (e.g., no calls after 9pm) * Close pools when campaigns end * Ensure accurate reporting periods **Example**: * **End date**: November 5, 2024 * **End time**: 9:00 PM * **Time zone**: Eastern * **End message**: "This phone bank has closed. Thank you for your hard work! Check back for future calling opportunities." *** ### Call pool strategy **1. Size your pools appropriately** **Small pools** (\< 100 people): * Use List call pools for more control * Good for targeted follow-up * Personal touch important **Medium Pools** (100-1,000 people): * Random pools work well * Consider splitting by geography or demographic * Monitor daily progress **Large Pools** (1,000+ people): * Random pools are essential * Break into multiple pools by priority * Assign dedicated project admins **2. Prioritize contacts** Create multiple pools: 1. "High Priority" (List) - VIPs, leaders, known supporters 2. "Medium Priority" (Random) - Members, past participants 3. "Low Priority" (Random) - Cold contacts, wide outreach Call high-priority pools first. **3. Refresh Pools Regularly** * Remove people who've been called * Add newly identified contacts * Update as campaign progresses * Don't let pools grow stale **4. Name Pools Clearly** Good naming: * "GOTV 2024 - Week 1 - High Priority" * "Member Survey - Oct" * "Pledge Cards - North Side - Evening" Bad naming: * "Pool 1" * "Test" * "Calling list" **5. Set Realistic Schedules** * Don't start too early (before 9am) * Don't end too late (after 9pm) * Consider time zones * Respect calling hour norms *** # Assessment codes Source: https://help.broadstripes.com/docs/admin-guides/data-tools/assessment-codes Configure assessment codes to track where workers stand in relation to your organizing campaign goals using numeric scales. ## Overview An essential piece of any organizing campaign is figuring out where the workers stand in relation to the campaign's goals. This is usually done using a numeric assessment scale, with 1 indicating strong support, and the highest number in the scale (usually 5) indicating hostility. The 5-point scale is useful because it gives you a neutral position (3) and two "leaning" options (2 and 4). Broadstripes makes it easy to set up assessment codes to match your campaign's style. You can create as many codes as you want, and supply descriptive text for each. **What's the difference between "Assessment codes," "Assessments," and "Codes"?** Absolutely nothing! "Assessment codes," "Assessments," and "Codes" all refer to the exact same piece of employment information in Broadstripes; it's just a matter of how it is labeled. In your [general settings](/docs/project-settings/general-settings), you can choose whether you want Broadstripes to refer to the numbers on the assessment scale as "Codes" or "Assessments," and you can go back to your general settings to change this label at any time. ## The assessment codes table The assessment codes page displays your codes in an interactive data grid with sortable, filterable columns: * **#** — The code number, shown as a colored circle * **Name** — The code description, with an actions menu (⋯) for editing and deleting * **Default** — A checkbox indicating the default code; click it to set or clear the project default directly in the table * **Contacts** — The number of contacts assigned this code (click to view them in search results) * **Created** and **Created by** — When the code was created and who created it You can click any column header to sort, and use the filter row below the headers to narrow down codes. The table also includes **Export** buttons to download your codes as a file. Assessment codes table ## Configure new assessment codes You can create your whole assessment scale in one step: 1. Click the **Project settings** icon in the upper right corner of any page (or press **Ctrl-K** / **⌘K**), then choose **Assessments** (or **Codes**, depending on your [General settings](/docs/project-settings/general-settings) label). 2. Click the **New\...** button in the table toolbar. The **New assessments** dialog opens with one empty row. 3. Each row is one assessment code. Enter a **number** and a short one- or two-word **label** that will appear on-screen and in reports (most projects use codes 1-5, but you can have as many or as few as you want). **Note:** Assessment codes must be numbers, and each number can only be used once — the dialog flags duplicates as you type. 4. Click **+ Add another assessment** to add a row for each remaining code on your scale. 5. If you want one code to be selected automatically when your end users enter a new contact in Broadstripes, click the **Default** button on its row. 6. To color your scale, pick one of the **Suggested Palettes** (Classic, Ocean, Sunset, Earth, or Mono) — the swatches preview how the colors will be spread across your codes. You can fine-tune individual colors later; see [Customize assessment colors](#customize-assessment-colors). 7. Click **Create assessments**. The dialog closes, a confirmation appears, and your new codes appear in the table. New assessments dialog with rows for a five-code scale and suggested palettes ## Assessment options Below the assessment codes table, the **Assessment options** panel contains toggle switches that control how assessments work in your project. Flip a switch to change a setting — each change saves automatically and a confirmation message appears, so there's no separate save button. Click the **info icon** () next to an option for a short explanation. Read-only users can see the options, but the switches are disabled. **Allow assessments for organizations** People (workers) can always be assessed, but by default organizations (workplaces) cannot. Turn this option on to allow organizations to be assessed as well. When enabled, the assessment disc and code selector appear on organization records just as they do on worker records, and organization assessment codes appear in search results and exports. **Display timeline dialog when the assessment is changed?** When this option is on, the timeline dialog appears any time someone using the app changes a record's assessment, asking them to provide more information about why the assessment changed. The dialog does not appear during data imports or other automated processes. Like the rest of the page, the panel and its option labels follow your project's terminology preference — you'll see **Code options**, **Allow codes for organizations**, and so on if your [General settings](/docs/project-settings/general-settings) label is "Codes." Assessment options panel with toggle switches below the assessment codes table ## Customize assessment colors Broadstripes automatically assigns colors to your assessment codes. You can customize these colors to match your campaign's preferences or to make certain codes more visually distinct. ### Change a code's color 1. Click the **Project settings** icon in the upper right corner of any page (or press **Ctrl-K** / **⌘K**), then choose **Assessments** (or **Codes**). 2. Find the assessment code you want to customize and open its **actions menu** (⋯) in the **Name** column, then click **Edit**. The **Edit assessments** dialog opens with that code selected. 3. In the **Color** field, click the button to open the color picker. Choose a color using any of these methods: * Click one of the six **Default Colors** swatches (green, light green, yellow, orange, red, or gray) * Type a custom hex color code (e.g., `#488E48`) into the **Hex** field, or adjust the **R**, **G**, and **B** values individually * Click the eye-dropper icon to open your browser's color selection tool, where you can pick any color from the full color gamut * Click **Reset to default** to revert to the automatically assigned color 4. Click **Save changes**. Assessment code color picker open in the Edit assessments dialog To recolor your whole scale at once, pick one of the **Suggested Palettes** at the bottom of the dialog instead of setting each color by hand. The scale preview at the top of the dialog shows the new colors before you save. ### Color best practices * Use distinct colors that are easy to differentiate at a glance * Consider using a color gradient that reflects the assessment scale (e.g., green for strong support, red for hostile) * Ensure colors have sufficient contrast for accessibility * Keep colors consistent across your campaign materials ## Edit or delete your assessment codes ### Edit 1. Find the assessment code you want to change in the table. Click the **actions menu** (⋯) in the **Name** column and select **Edit**. Assessment codes actions menu 2. The **Edit assessments** dialog opens, showing your full scale as a row of colored discs at the top. The code you chose is selected — click any other disc to switch to that code, so you can edit several codes in one sitting. 3. Change the **label**, **number**, **color**, or **default** setting for each code you want to update. If you change a code's number, the dialog tells you how many contacts will receive the new number. 4. Click **Save changes**. All of your edits are saved at once, and you'll see a confirmation. Edit assessments dialog with the scale preview and editing fields ### Delete 1. Find the assessment code you want to remove. Click the **actions menu** (⋯) in the **Name** column and select **Delete**. 2. Confirm that you want to delete the assessment by clicking **OK** when prompted. 3. The assessment code will be removed from your project, and all contacts who were previously assigned that code will have no code (i.e. their assessment field will now be blank). While a deletion is processing, the **Delete** option in the actions menu is temporarily disabled for all assessment codes. Wait for the current deletion to finish before deleting another code. # Broadstripes built-in fields Source: https://help.broadstripes.com/docs/admin-guides/data-tools/broadstripes-built-in-fields Complete guide to all of the built-in fields Broadstripes provides for people, organizations, addresses, and contact information Here's your guide to all of the built-in fields Broadstripes provides for your project. Broadstripes provides a number of built-in information fields for your project so that you can set it up and add information easily and quickly. This is a complete guide to all of those fields and their intended use. ## People **Notes**: This is a simple text box for preserving information that does not fit neatly into a format, and also should not be its own custom field. Often notes are one-time events, for example, "8/26, met Jane's neighbor, she said Jane works Friday evenings 3-11." Sometimes they are bits of information specific to the person: "Jane is cousins with Supervisor Maria." **Nickname**: Here you can put any nicknames that could help you identify or keep track of your workers. This allows you to retain the worker's legal name in your data while allowing people to find them by the name they are commonly called. **Do not email**: This check-box (labeled "Do not email (applies to bulk emails from the search results)" in the app) allows you to quickly "opt out" a person from bulk emails sent from your search results. It is un-checked by default, meaning every person you upload into Broadstripes is included in bulk emails unless you check this box. To opt a person out of text messages, set the messaging permission on the individual phone number under **Contact info** instead. **Title**: A person's preferred title. e.g. Dr., Mrs., Ms., and so on. This is useful for mass mailings. **First name**: A person's (legal, official, real) first name. **Middle name**: A person's middle name. **Last name**: A person's last name. This can be changed in the app in case of marriage/divorce/other name change. **Suffix**: Any suffixes such as Jr., Senior, II, III can be recorded in-app as well. This is particularly useful when multiple family members work for the same employer. **Birth date**: This field records worker birth dates in MM/DD/YYYY format. Birth dates are useful when trying to correctly identify workers with common names or the same name, and also may be used for matching employer records. **Party ID**: If your project includes voter data, you can use the "Party ID" field to enter registered voters' party affiliation. This is a drop-down menu containing whatever different parties are represented in your data. **Employment**: The Employment field has several subfields. Department and Classification are the two most commonly used ones, e.g. Department: Housekeeping, Classification: Guest Room Attendant. Other available subfields include Employee Number, Work location, Hours, Hourly rate, Employee status, Start date, Recent hire date, Date last paid, Seniority date, Bargaining unit member (checkbox), Tip card (checkbox), and full/part time (text box). Depending on the needs of your organization, it may be more useful to create custom fields for this information instead of using the available subfields under Employment. **Union member**: This is a simple yes/no checkbox. It can be disabled if your union's membership structure requires a more complicated, custom field. **Contact info**: Here is where your person's emails, phone numbers, and other contact details can be stored. Often workers will have work emails and personal emails, and a cell, work, and home number. Broadstripes allows you to classify every entry into the Contact Info field by use type (Personal, Business, Home, or Other) and contact type (Phone, Email, Fax, Pager, IM, Link (URL)). You can also set Messaging Permissions for every entry (opt-in or opt-out). **Address**: You can add as many addresses to this field as you want; just make sure to select the correct Primary address. Only one address can be the Primary address. That address will be the default address displayed in searches. The Address field has many components, not all of which need to be used for any given entry. The components are: Street Number (e.g. **100** Main St.) Direction prefix (e.g. **North** Main St.) Street Name (e.g. Main St.) Street Type Direction Suffix (e.g. Main St. **South**) Unit (Unit 101) Care of (you probably won't use this field unless you are delivering a package to your worker) PO Box (this is where you would enter a PO Box number) City (e.g. New Haven) State (the two-letter abbreviation, e.g. CT) Zip (first five) e.g. 06511 Zip (plus 4) (e.g. 0611-7045) Organization/Other (if the address is a work address, or any other information about it). You can also mark addresses as bad. Only do this if you are sure the address is wrong in some way-- if a piece of mail gets returned to you, or the building in question is demolished, or you are otherwise certain that the worker no longer lives there. If you are not certain an address is bad, you can mark it as "Needs review" instead, which will allow you to find it easily at a later date to change or update it. ## Organizations **Name**: The official name of the organization. **Nickname**: If the organization is commonly called something other than its official name, input it here. For instance, Saint Vincent Hospital's nickname could be SVH. **Notes**: This is a simple text box for preserving information that does not fit neatly into a format, and also should not be its own custom field. Often notes are bits of information specific to the organization, for instance, "Floor 12 supervisor is Mary." **Addresses**: Depending on how big your organization is, it may have multiple locations. You can record all affiliated addresses in the Addresses field, although this may not be useful for very large organizations/workplaces. Only one address may be the Primary address: a mailing address or central office is a good choice for a Primary address. Using the Organization/Other field, you can denote what each address is for (e.g. Billing Department, Human Resources, etc). **Contact information**: Contact details for the organization including phone numbers, emails, and other communication methods. **Parent organization ID**: For organizations that are part of a larger entity, this field can track the relationship to the parent organization. **Website**: If the employer/organization has a website, it can be stored in this field. # Built-in data Source: https://help.broadstripes.com/docs/admin-guides/data-tools/built-in-data Guide to Broadstripes' built-in information fields for people, organizations, addresses, and contact information ## Intro Broadstripes comes with a number of built-in information fields already included. This means that you can set up your project and add information to it easily and quickly. Below is a quick guide to Broadstripes' built-in fields and their intended use. (Click [here](/docs/data-import-admin/data-import-fields) for a full guide to Broadstripes built-in fields and custom fields) ## People Here's how to store information about workers. *The detailed built-in people fields table is available in the full data import fields guide referenced above.* ## Organizations *This section is being drafted, but isn't ready for prime-time yet. Please check back here soon.* ## Physical addresses Here's a look at all the built-in components of an Address. Just remember that you don't need to use all of them for any given entry. *The detailed address components table is available in the full data import fields guide referenced above.* ### Multiple addresses and primary addresses Some people or organizations have multiple locations or addresses. You can add as many addresses to Broadstripes' address field as you want; just make sure to select the correct **Primary address**. Only one address can be the Primary address, and once chosen, that address will be the default address displayed in searches. For **organizations**, a mailing address or central office is a good choice for a Primary address. For **workers**, the worker's current home address is the recommended choice for a Primary address. Commonly, **organizations** have multiple locations or addresses. You can record all affiliated addresses in the **Addresses** field, although this may not be useful for very large organizations/workplaces. Using the **Organization/Other** field, you can denote what each address is for (e.g. Billing Department, Human Resources, etc). ### Bad addresses or addresses that need review You can also mark addresses as "**bad**". Only do this if you are sure the address is wrong in some way-- if a piece of mail gets returned to you, or the building in question is demolished, or you are otherwise certain that the worker no longer lives there. If you are not certain an address is bad, you can mark it as "**Needs review**" instead, which will allow you to find it easily at a later date to change or update it. ## Contact information *This section is being drafted, but isn't ready for prime-time yet. Please check back here soon.* ## Employment field and sub-fields *This section is being drafted, but isn't ready for prime-time yet. Please check back here soon.* # Built-in tools Source: https://help.broadstripes.com/docs/admin-guides/data-tools/built-in-tools Overview of Broadstripes' built-in organizing tools designed specifically for labor organizing campaigns ## Overview Broadstripes was built primarily to help labor organizers find and use information effectively during campaigns. One of its key strengths is the collection of built-in tools within Broadstripes that are designed specifically to collect and organize information relevant to labor organizing. These organizing tools are designed to address workers' personal opinions, leadership in social groups, and employment information that organizers need to run effective campaigns. ## Key built-in tools ### Built-in data fields You can easily populate your project with workers' addresses, departments, and more in just a few minutes using built-in fields. These fields are pre-configured to capture the most common types of information needed for organizing campaigns. For a complete list of built-in data fields and their explanations, see the [built-in data](./built-in-data) article. ### Assessment codes Assessment codes are one of the most important tools for tracking worker support during organizing campaigns. **How assessment codes work:** * You can code a worker using a scale of 1 to 5 * Typically, 1 means "on board" and 5 means "most hostile" * The scale allows you to track varying levels of support or opposition **Common uses for assessment codes:** * Count who will sign a union card * Track potential votes in a union election * Count petition signatures * Keep track of potential votes in political elections * Turn out workers to meetings or rallies Assessment codes provide organizers with a quick, standardized way to evaluate and track worker sentiment throughout a campaign. ### Leadership roles The leadership roles tool helps you identify and organize the social structure within your workplace or community. **How leadership roles work:** * You name leaders in your shop or workplace * You can then assign them people to lead * This creates a hierarchical structure that reflects real workplace relationships **Benefits of leadership roles:** * Track natural workplace leaders and influencers * Organize workers into leadership structures * Plan targeted outreach through identified leaders * Build organizing committees based on actual workplace dynamics ## Why use built-in tools? These built-in tools offer several advantages over custom solutions: * **Proven in practice**: These tools have been developed based on real organizing campaign needs * **Ready to use**: No setup required - you can start using them immediately * **Standardized**: Consistent approach across different campaigns and organizations * **Integrated**: Work seamlessly with other Broadstripes features like reporting and mapping ## Getting started with built-in tools To start using these built-in tools effectively: 1. **Assess your campaign needs**: Determine which types of information are most critical for your specific organizing goals 2. **Set up assessment scales**: Define what each assessment code (1-5) means for your campaign 3. **Identify leaders**: Begin mapping out leadership structures in your workplace or community 4. **Train your team**: Ensure all organizers understand how to use these tools consistently These built-in tools provide the foundation for effective data collection and analysis in your organizing campaigns, helping you make informed strategic decisions based on solid information. # Contact information Source: https://help.broadstripes.com/docs/admin-guides/data-tools/contact-information Understanding how to store and manage contact information including emails, phone numbers, links, and messaging permissions The Contact Information field is where your worker's emails, phone numbers, and other contact details can be stored. Often workers will have multiple types of contact information with different purposes. Here is a guide to all the possible options. Broadstripes allows you to classify every entry into the Contact Info field by use type (Personal, Business, Home, or Other) and contact type (Phone, Email, Fax, Pager, IM, Link (URL)). ## Use types * **Personal**: Contact information for personal use * **Business**: Work-related contact information * **Home**: Home contact information * **Other**: Any other type of contact information ## Contact types * **Phone**: Phone numbers (mobile, landline, etc.) * **Email**: Email addresses * **Fax**: Fax numbers * **Pager**: Pager numbers * **IM**: Instant messaging handles * **Link (URL)**: A website or URL (e.g. a social media profile or a personal page). The value is displayed as a clickable link that opens in a new tab. You can enter a full URL like `https://instagram.com/janedoe` or a bare address like `instagram.com/janedoe` -- Broadstripes adds `https://` automatically. Each contact entry can also have messaging permissions set to control opt-in or opt-out preferences for communications. ## Email format validation When you expand an email contact info entry to edit it, Broadstripes checks the address format as you type. If the value does not look like a valid email address, a warning appears below the field: **"Please enter a valid email address."** The field is highlighted in red until the address is corrected or cleared. The check runs in real time in the browser and matches the same rules the server enforces when you save -- so if no warning is shown while typing, the address will be accepted on save. # Copy to Project Source: https://help.broadstripes.com/docs/admin-guides/data-tools/copy-to-project-guide The **Copy to Project** feature allows you to copy contacts and their associated data from one Broadstripes project to another. This is useful for sharing contacts between campaigns, creating backup projects, or transferring data to new organizing efforts. *** ## Prerequisites & Permissions To use the Copy to Project feature, you must meet the following requirements: | Requirement | Details | | ----------------------- | ------------------------------------------------------------------------------------------ | | **Role** | You must be a **Project Admin** in **both** the source project and the destination project | | **Membership** | You must have an active membership in both projects | | **Destination project** | The destination project must already exist | Basic users cannot access this feature. If you don't see "Copy to project" in the Actions menu, contact your project administrator. *** ## When to Use Copy to Project **Common Scenarios** 1. **Starting a new campaign from existing contacts** * You have a successful organizing campaign and want to start a related effort with the same worker contacts 2. **Creating regional or departmental projects** * Splitting a large project into smaller, more manageable projects based on geography or department 3. **Sharing contacts between affiliate organizations** * Multiple unions or organizations need access to the same pool of contacts 4. **Creating a test or training project** * Copy real data to a separate project for training new staff or testing workflows 5. **Backing up critical contacts** * Preserving a snapshot of contact data at a specific point in time or archiving old data 6. **Consolidating campaign data** * Bringing together contacts from multiple organizing drives *** ## Step-by-Step Instructions **Step 1: Search for Contacts** 1. Navigate to your source project 2. Use the **Search** feature to find the contacts you want to copy 3. You can use any search criteria (lists, events, custom fields, etc.) to filter your results **Step 2: Access the Copy to Project Feature** 1. From the search results page, click the **Actions** dropdown menu 2. Select **"Copy to project"** Actions Menu **Step 3: Select Destination Project** 1. A panel will appear with a dropdown menu 2. Select the **destination project** from the list * Only projects where you have Project Admin access will appear 3. Click **"Review data to be copied"** You must select a project before proceeding. If you click "Review data to be copied" without selecting a project, you'll see the error: *"Please select a project."* **Step 4: Select Contacts** Before clicking "Review data to be copied," select the contacts you want to copy: * **Individual selection:** Click the checkbox next to each contact you want to copy * **Select all:** Use the "Select all" checkbox to select all contacts in the current search results > **Important:** You must select at least one contact. If no contacts are selected, you'll see the error: *"Please select one or more contacts."* **Step 5: Review the Data Preview** The review screen shows three important sections: #### Settings to be Copied A list of project settings that will be created in the destination project if they don't already exist: * External Systems * Custom Fields * Leader Roles * Assessment Codes * Event Steps * Lists (Shared tags only) * Classifications * Relationship Types * Parties #### Data to be Copied A count of all data items that will be copied: * People and Organizations * Addresses and Phone/Email * Timeline entries * Event Steps and Custom Field values * External IDs and List Assignments * Employments (active and terminated) * Department Indicators * Leaderships (active and terminated) * Parent Organizations and Primary Organizations * Relationships #### Broken Relationships Lists relationships that will NOT be copied because the related contact isn't in your selection. See [Broken Relationships Warning](#broken-relationships-warning) for details. **Step 6: Execute the Copy** 1. Review the data summary carefully 2. *(Optional)* Check **"Send me an email when the copy is complete"** to receive notification 3. Click **"Copy to \[Destination Project Name]"** You'll see a confirmation message: > *"Your request has been made to copy the data. Refresh the page to check for completion."* **Step 7: Monitor Progress** 1. The copy operation runs in the background 2. Navigate to **Bulk Tasks** to monitor progress (in the source project) 3. Once complete, the task will show: * Number of contacts successfully copied * Any errors that occurred *** ## What Gets Copied **Project Settings (Created if not existing)** | Setting Type | What Gets Created | | ------------------- | ------------------------------------------------- | | External Systems | Name, locked status, multiple employment settings | | Custom Fields | Data type, HTML element, options, description | | Lists | Name and description (shared tags only) | | Events & Steps | Event name, description, end date, and all steps | | Classifications | Name | | Relationship Types | Name, preposition, entity type, complement type | | Leader Roles | Name and description | | Assessment Codes | Code number, description, default status | | Parties | Name and abbreviation | | Journal Entry Types | Name (custom types only) | **Contact Data** | Data Type | Fields Copied | | -------------------------- | ----------------------------------------------------------------------------- | | **People** | Name, title, suffix, occupation, sex, birth date, greeting, organizing groups | | **Organizations** | Name | | **Addresses** | Full address details, geocode, type, primary status | | **Phone/Email** | Data, type, group, primary status, notes | | **Journal Entries** | Type, notes, date, direct contact flag, assessment codes | | **Custom Field Values** | All custom field assignments | | **External System Values** | All external ID assignments | | **List Assignments** | Active shared tag memberships | | **Event Step Assignments** | All event step assignments | **Relationships** | Relationship Type | Copied When | | -------------------------- | ----------------------------------------------------- | | **Employments** | Both the person AND organization are in the selection | | **Terminated Employments** | Same as employments | | **Leaderships** | Both the leader AND follower are in the selection | | **Terminated Leaderships** | Same as leaderships | | **Parent Organizations** | Both organizations are in the selection | | **Primary Organizations** | Both the person AND organization are in the selection | | **Relationships** | Both contacts (A and B) are in the selection | *** ## Understanding Employment Relationships Employment records link People to Organizations. To preserve these relationships when copying: ### Retaining Employment Relationships **Both the person AND the organization must be selected** for the employment to be copied. **Example:** * If you copy Jane Doe who is employed at Acme Corp: * ✅ **Employment IS copied** if both Jane Doe AND Acme Corp are in your selection * ❌ **Employment is NOT copied** if only Jane Doe is selected ### Special Cases 1. **Employments without organizations** * Some employments may only have a person (no linked organization) * These are always copied with the person 2. **Multiple employments** * If a person has multiple employments, each one is evaluated separately * Only employments where both parties are selected will be copied 3. **Terminated employments** * Follow the same rules as active employments * Include additional fields: `date_ended` and `reason_ended` 4. **Employment external systems** * External system values linked to copied employments are also copied ### Previous Copy to Project Jobs May Block Employment Copying **Each copy operation is evaluated independently.** If you copied an organization in a previous job, you cannot copy a person's employment to that organization in a later job—even if you include the organization in your selection again. **Example scenario:** 1. **First copy job:** You copy Acme Corp (organization) to the destination project ✅ 2. **Second copy job:** You copy Jane Doe (who is employed at Acme Corp) and include Acme Corp in your selection **Result:** * Acme Corp is **not duplicated** (the system recognizes it was already copied) * But Jane Doe's employment at Acme Corp is **still NOT copied** **Why?** The system filters out already-copied contacts *before* checking employment relationships. Since Acme Corp is filtered out as "already copied," it's not included in the employment eligibility check. **The review screen will flag this.** The [Broken Relationships](#broken-relationships-warning) section in the data preview will show the employment as broken, even though you included the organization in your selection. This is your signal that the employment will not be copied. **The key takeaway:** To preserve employment relationships, you **must include both the person AND their employer organization in the same copy operation**—ideally the first time either is copied. #### Workarounds for Previously Copied Contacts If the organization was already copied in a previous job and employment relationships were not transferred, you can recreate them in the destination project using one of the following approaches: **Option 1: Data import in the destination project (recommended)** Use the [data import](/docs/data-import-admin/data-import-overview) feature to create employment relationships from a spreadsheet. This is the best option when you need to link multiple people to organizations that already exist in the destination. 1. Prepare a spreadsheet containing the affected people and their employment details 2. Include columns that allow Broadstripes to [match to existing people](/docs/data-import-admin/update-contacts-with-an-import) in the destination — such as a Unique ID (e.g., an external system ID or Broadstripes ID) or name fields (First Name, Last Name) 3. Include [employment columns](/docs/admin-guides/data-tools/employment-field-and-subfields) such as **Employer**, **Department**, **Classification**, and any other employment subfields you need to transfer 4. [Import the spreadsheet](/docs/data-import-admin/import-a-spreadsheet) in the **destination project** — click the **Project settings** icon in the upper right corner of any page (or press **Ctrl-K** / **⌘K**), choose **Data imports**, and click **+ New\...** 5. During column mapping, map your employment columns to the corresponding Broadstripes fields 6. In the Configuration panel, check **"Automatically create shops and departments and link employments"** 7. Preview and run the import Since both the people and organizations already exist in the destination project, the import will match to the existing records and create the employment link between them — without duplicating contacts. **Option 2: Manual recreation** For a small number of employments, open each person's record in the destination project and manually add the employment relationship. This is practical for fewer than \~10 employments but does not scale well. ### How to Ensure Employments Are Copied 1. When selecting contacts, include all related organizations 2. Use the **Broken Relationships** section in the review to identify missing parties 3. Click on the numbered button in the Broken Relationships section to see which contacts need to be added *** ## Broken Relationships Warning The review screen shows a **Broken Relationships** section that lists relationships that will NOT be transferred because one party is missing from the working set. A contact can be missing from the working set if it was not included in your selection **or** if it was already copied to the destination in a previous job. ### Understanding the Warning | Relationship Type | What It Means | | -------------------------- | ------------------------------------------------- | | **Employments** | Person selected, but employer organization is not | | **Terminated Employments** | Same as above for historical employments | | **Leaderships** | Leader or follower is not in the selection | | **Terminated Leaderships** | Same as above for historical leaderships | | **Parent Organizations** | Parent or child organization is missing | | **Primary Organizations** | Person or their primary organization is missing | | **Relationships** | One of the two related contacts is missing | **Already-copied contacts count as "missing."** If a contact was copied in a previous job, it is removed from the working set before relationship checks run. Relationships involving that contact will appear as broken — even if you included the contact in your current selection. See [Previous Copy to Project Jobs May Block Employment Copying](#previous-copy-to-project-jobs-may-block-employment-copying) for details. ### Viewing Affected Contacts 1. In the Broken Relationships section, click the **numbered button** next to each relationship type 2. This creates a temporary list and opens a new search showing the affected contacts 3. Use this information to decide whether to add more contacts to your selection ### Resolving Broken Relationships 1. **Add missing contacts:** Go back and include the missing organizations or people in your selection 2. **Accept the break:** If you don't need the relationship in the destination, proceed with the copy 3. **Recreate later:** You can manually recreate relationships in the destination project after copying, or use [data import](/docs/data-import-admin/data-import-overview) to create them in bulk **Option 1 will not work if the missing contact was already copied in a previous job.** In that case, the contact is filtered out of the working set regardless of whether you include it in your selection. See [Workarounds for Previously Copied Contacts](#workarounds-for-previously-copied-contacts) for how to recreate the relationships after the copy. *** ## Common Errors ### Validation Errors | Error Message | Cause | Solution | | --------------------------------------- | ------------------------------- | ------------------------------------ | | *"Please select a project."* | No destination project selected | Choose a project from the dropdown | | *"Please select one or more contacts."* | No contacts checked for copying | Select at least one contact checkbox | ### Permission Errors | Error | Cause | Solution | | ------------------- | ---------------------------------------------------- | -------------------------------------------------- | | Access denied | Not a Project Admin in one or both projects | Request Project Admin access from an administrator | | Project not in list | You don't have membership in the destination project | Request membership in the destination project | ### Copy Errors (Shown in Bulk Tasks) | Error Type | Example | Cause | | --------------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | | **Person validation** | *"Person: Validation failed: Person is invalid (first\_name: , last\_name: )"* | Person has invalid or missing required data | | **Contact info error** | *"Contact info: cannot access stuff (contact\_id: 123, type: Phone)"* | Error accessing related data during copy | | **Custom field validation** | *"Custom field assignment: Validation failed: Value is not valid for Shift (custom\_field: Shift, value: AM)"* | Custom field value doesn't match destination project's options | | **External system error** | Database connectivity or external system lookup failure | Temporary system issue—retry later | #### Custom Field Validation Errors This error occurs when a custom field value in the source project is not a valid option in the destination project. This typically happens when: 1. **The custom field exists in both projects but with different options** * Source project has "Shift" field with options: AM, PM, Night * Destination project has "Shift" field with options: Day, Evening, Night * Copying a contact with "AM" fails because "AM" isn't a valid option in the destination 2. **The custom field was created in the destination but options weren't copied** * The copy operation creates new custom fields if they don't exist * But if a field with the same name already exists, its options are NOT updated **Solutions:** * **Before copying:** Ensure custom field options in the destination project match or include all options from the source project * **After error:** Add the missing option to the custom field in the destination project, then re-copy the affected contacts ### Partial Completion If some contacts fail to copy: * The Bulk Tasks page shows the number successfully copied * Detailed error messages list each failure * Successfully copied contacts remain in the destination * You can fix the source data and retry copying the failed contacts *** ## Tips & Best Practices **Before Copying** 1. **Clean your data first** * Ensure people have valid first or last names * Fix any data validation issues in the source project 2. **Plan your selection carefully** * Include all related organizations if you need employments * Use the preview to understand what will transfer 3. **Check existing data** * Contacts already copied to the destination will be skipped * The review shows *"Contacts already copied to \[project]"* count **During the Copy** 1. **Use email notifications for large copies** * Check "Send me an email when the copy is complete" for large batches * Large copies can take 30+ minutes 2. **Don't navigate away too quickly** * Wait for the confirmation message before leaving the page * The job runs in the background, but ensure it's queued **After Copying** 1. **Verify the results** * Check the Bulk Tasks page for the final status * Review any error messages 2. **Spot-check the destination** * Open a few copied contacts in the destination project * Verify relationships, custom fields, and other data transferred correctly 3. **Re-copy if needed** * Already-copied contacts are automatically skipped * You can safely re-run the copy to catch any that failed **Understanding Duplicate Prevention** Broadstripes tracks which contacts have been copied by creating an External System in the destination project named after the source project's ID. This prevents duplicate copies if you run the same copy operation multiple times. *** ## Frequently Asked Questions **Q: Can I copy contacts to multiple projects at once?** A: No, you must copy to one destination project at a time. Run separate copy operations for each destination. **Q: Will duplicate contacts be created if I copy twice?** A: No, the system tracks previously copied contacts and skips them automatically. **Q: Can I undo a copy operation?** A: There is no automatic undo. You would need to manually delete the copied contacts from the destination project. **Q: Are attachments copied?** A: No, file attachments are not included in the copy operation. **Q: What about saved searches and layouts?** A: These are project-specific and are not copied. You'll need to recreate them in the destination project. **Q: Can regular users see copied contacts?** A: Yes, once contacts are in the destination project, visibility follows normal project permissions. **Q: I copied an organization first, then copied a person employed there. Why didn't the employment transfer?** A: Each copy operation is evaluated independently. The system filters out already-copied entities before checking employment relationships. Since the organization is recognized as "already copied," it's excluded from the employment eligibility check. The review screen's [Broken Relationships](#broken-relationships-warning) section will flag this before you execute the copy. To preserve employments, both the person and organization must be included in the **same** copy operation. **Q: If I include an already-copied organization in my selection, will it be duplicated?** A: No, previously copied contacts are automatically skipped and won't be duplicated. However, this also means they won't count toward employment relationship checks in later copy operations. *Last updated: February 2026* # Events Source: https://help.broadstripes.com/docs/admin-guides/data-tools/creating-an-event Learn how to create, edit, and manage events and event steps to track campaign activities and worker engagement ## Overview **Events** are one type of custom field in Broadstripes. Each event can be created to contain one or more "**steps**" (checkboxes) to capture particular actions in the workflow of a given campaign activity. Some examples of when you might use events include recording a worker's involvement in rallies and marches, or the signing of a petition or union card. You should use events to record information that occurred at a certain time, whereas you'll use [built-in data fields](/docs/admin-guides/data-tools/built-in-data) or [custom fields](/docs/admin-guides/data-tools/custom-fields) to record information that is always true. If you'd like to learn more about what events are and exactly when they should be used, take a look at the [Create events to track your goals](/docs/customize/create-events-to-track-goals) article in the User Guide. ## The Events page To reach the Events page, click **Events** in the left-hand navigation panel. The page shows all your project's events as expandable cards. A toolbar at the top lets you filter, search, and sort: * **Active / Inactive / All** toggle — switch which events are shown; each button shows a count. * **Search box** — type to instantly filter events by name or step name. Cards whose steps match expand automatically to show the matching steps. * **Sort** button () — choose from several sort options: most recently active, newest, oldest, most contacts, fewest contacts, name A–Z, name Z–A, ends soonest, or ends latest. * **Expand all** / **Collapse all** icon buttons — open or close every visible card at once. Events index page The Events page is accessible to all users, and any user can create, edit, and delete events. In a read-only project the page is view-only -- the editing controls don't appear. ## Create an event Together, events and event steps let you track information that's important to your organizing efforts. In this example, we'll set up an event for an external organizing card-signing drive named "**Card**" with steps named "Signed," "On file," and "Email sent." (If you want to understand when it's appropriate to use events and when it's better to use another data object, please review the [Data tools overview](/docs/admin-guides/data-tools/data-tools-overview) article or the [Create events to track your goals](/docs/customize/create-events-to-track-goals) article.) 1. Click **Events** in the left-hand navigation panel to open the Events page. 2. Click the **+ New Event** button in the toolbar. A new card appears at the top of the list with a name field ready to type in. 3. Type the name of the event (e.g. "Card") and press **Enter** (or click away) to save it. The event is created immediately and a blank step field appears so you can add the first step. Adding a new event card 4. Type the name of the first step (e.g. "Signed") and press **Enter** to save it. A new blank step field appears automatically so you can keep adding steps. 5. Add as many steps as you need (following our example: "On file" and "Email sent"), pressing **Enter** after each one. When you're done adding steps, press **Escape** or click elsewhere to finish. Adding event steps 6. That's it -- the event and its steps are saved as you go. There's no separate Save button. 7. Follow the steps above to create as many events as you want for each project (there is no limit to how many events you have). ## View an inactive event When an event ceases to be relevant to the active organizing work, you can [make the event inactive](#make-an-event-inactive). Inactive events are hidden from users' data-entry forms and from most reports. To see inactive events, click the **Inactive** button in the toolbar. You can also click **All** to see active and inactive events together. Inactive events tab ## Event settings When you expand an event card (click the chevron or click the header row), a details panel appears at the bottom of the card where you can set these options: * **End date** — the date on which the event ended or is scheduled to end. Optional. * **Single choice** — when on, checking one step of this event automatically unchecks all others. Useful for mutually exclusive steps (like "Signed" and "Declined to sign"). * **Description** — free-form notes about what this event tracks. The description is shown as a short summary line in the collapsed card header. Changes to these fields save automatically when you click or tab away. You can read more about event options in the [Create events to track your goals](/docs/customize/create-events-to-track-goals) article. ## Step settings Each step has a settings popover that you can open by clicking the **step settings** icon () on the step's row. The popover has two sections: **Behavior** * **Timeline tracked** — when on, checking this step prompts the user to enter a timeline note. Use this for steps that represent a meaningful milestone you want recorded in a contact's history. **Include on** * **Detail reports** — whether this step appears on contact detail reports. * **House visit sheets** — whether this step appears on house visit sheets. * **Walk lists** — whether this step appears on walk lists. * **Phone lists** — whether this step appears on phone lists. Active chips showing which options are on are displayed directly on the step row so you can see at a glance which settings are enabled without opening the popover. ## Make an event inactive If you have an event that's no longer important to your current work, but you aren't ready to delete the information it tracks, you can deactivate it. Deactivating an event hides it from data-entry forms and most reports. If you ever need to see the data again, you can re-activate the event. 1. Click **Events** in the left-hand navigation panel. 2. Find the event you want to deactivate (use the search box or browse the list). 3. Click the **more actions** button () on the event card and choose **Deactivate**. 4. The event immediately moves to the Inactive list. ### Calculated columns and inactive events If you have a calculated column whose search text refers to an inactive event or any of that inactive event's steps, the column's calculations will still display. To hide the column, delete the column from your layout or report. ### What if I want to see the event data again? The data in a deactivated event remains in Broadstripes' database. Because it's inactive, the event and all its steps will disappear from data-entry forms, and they won't show up on reports. You also won't be able to search using values from that event as your search criteria. If you decide that you need to see the data again (or use it for a search or in a report), you can simply re-activate the event: ## Re-activate an inactive event 1. Click **Events** in the left-hand navigation panel. 2. Click the **Inactive** button in the toolbar to switch to the inactive event list. 3. Find the event you want to reactivate. 4. Click the **more actions** button () on the event card and choose **Reactivate**. 5. The event and all its associated steps are now active again and the data will be viewable just as it was before being deactivated. ## Edit an event All editing on the Events page is inline -- there's no separate "edit mode" to turn on, and all changes save automatically. ### Rename an event Click the event name in the card header. The name turns into an editable field. Make your changes and press **Enter** (or click elsewhere) to save. Press **Escape** to cancel. ### Rename a step Expand the event card, then click the step name. The name turns into an editable field. Make your changes and press **Enter** (or click elsewhere) to save. ### Add a step to an existing event Expand the event card and click the **add step** link at the bottom of the step list. A blank field appears -- type the step name and press **Enter** to save it (or **Escape** to cancel). ### Reorder steps Expand the event card, then drag the **drag handle** icon () on the left side of any step row to move it to a new position within the event. You can also use the **move up** () and **move down** () arrow buttons that appear when you hover over a step row. ### Move a step to a different event You can drag a step from one event card and drop it onto another event card to move the step. If the target event card is collapsed, drop the step anywhere on the card header. ### Delete a step Expand the event card, then click the **more actions** button () on the step row and choose **Delete step**. Broadstripes will ask you to confirm before deleting. Deleting a step removes it and all its history permanently. This cannot be undone. ## Delete an event ### Deleting an event is permanent Deleting an event removes the event *and all its associated steps and history* permanently from your project. If you want to keep an event and its associated data in your project, but want it hidden from your users' view, you should **deactivate** the event rather than delete it. Read more in the [Make an event inactive](#make-an-event-inactive) section above. 1. Find the event you want to delete (use the search box or browse the list). 2. Click the **more actions** button () on the event card and choose **Delete event**. 3. Broadstripes will prompt you to confirm the deletion. 4. The event and all its associated steps will be removed from your project. After deletion, the event and its steps will no longer show on any contact's record, and all history of the event will be gone. ## Contact counts Each event card shows the total number of contacts checked into any step of that event as a clickable link. Clicking that count opens a search showing those contacts. Each step row shows its own count -- contacts checked into that specific step -- also as a clickable link. ## Learn more You and members of your team can also read the [Create events to track your goals](/docs/customize/create-events-to-track-goals) article to learn about how different types of events work and how to add events to your data entry layouts. # Custom fields Source: https://help.broadstripes.com/docs/admin-guides/data-tools/custom-fields Create and manage custom fields to capture data specific to your organizing campaign that doesn't fit in built-in fields ## Overview Data that is permanently relevant about the worker (such as "Shift" and "Issues of Concern") – but can't logically be mapped to one of [Broadstripes' built-in fields](./built-in-data) – is best captured in a **custom field**. ## How is a custom field different from an event? A custom field differs from an [event](./creating-an-event) in a few ways. **Events** (which are covered in their own articles – [Using events to track goals](/docs/customize/create-events-to-track-goals) and [Creating an event](./creating-an-event)) are probably the most widely-used custom data tool in Broadstripes. Use them to: * record data that is being tracked for a **certain period of time** (such as a worker's involvement in rallies and marches) * record important **one-time information** or **occurrences** (like the signing of a petition or union card). * record information that can be captured using a **checkbox** (events do not allow any other data types) **Custom fields** may not be as commonly used as events, but custom fields have two key advantages: * They can **capture a wide variety of data types** (text, date, checkbox, memo (long text), dropdown box, multi-select dropdown), whereas events can only use checkboxes to capture data. * They are **more directly and permanently associated with the worker** (or organization) for which they are created than events, which are typically used to capture time-sensitive data. ## Examples of custom fields Here are some examples of what custom fields often record: * the date a worker signed a card * a checkbox to indicate that a union member is in good standing with dues * a multi-select dropdown box that allows you to indicate which issues are most important to each worker Broadstripes allows you to create an unlimited number of numeric, date, checkbox, text, and memo (longer text) custom fields. Custom fields can apply to people, organizations, or both. Read on to learn more about working with custom fields: ## Create a new custom field This section describes the process of creating one type of custom field called a "drop-down box." Custom fields can be set up to capture other data, too (dates, checkboxes and so on). If you're still unclear about what custom fields are, or whether you need them to capture your data, please read [Data tools overview](./data-tools-overview). For this example, we are going to capture the top area of interest (e.g. contracts, scheduling, or grievances) for a potential leader in a new custom field called "**Interests**": 1. Get started by logging in to your project as a user with admin permissions. Click the **Project settings** icon in the upper right-hand corner of the page (or press **Ctrl-K** / **⌘K**), then choose **Custom fields**. That will take you to your project's custom field index, a page listing any custom fields already created in the project. Custom fields settings page 2. Create a new field by clicking the **New\...** button in the toolbar above the list. New custom field button ### Configure the custom field Use the form that opens to create your new custom field. 1. **Name** the custom field. Use a clear and concise name, and avoid punctuation if you can help it — it makes searching on the field trickier. 2. Give the field a **Description**. The description will be displayed in a pop-up box as guidance for your users. 3. Check **Enabled**. If a custom field's data ever becomes irrelevant, but you are not ready to delete it, you can uncheck this box to disable the field. You can also use the **Visible to admins only** and **Editable by admins only** options to control who can see or change the field — see [Control who can see and edit a custom field](#control-who-can-see-and-edit-a-custom-field) below. 4. (Optional) Link your field to the correct **External system**. A custom field linked to an external system is updated when you import a new spreadsheet. If no external system is selected, the field will need to be updated manually by users via data entry. For this example, we'll choose **Legacy CRM Database** as the external system since that is where our worker records will be imported from. 5. Next, for **Applies to**, select the **type of contact** the field will be used for (Person, Organization, or All contacts). For our example, we'll choose **Person**, since we are tracking a person's interests. 6. Choose the **Field type** to determine how your data choices will be displayed (e.g. check box, drop-down chooser, multiple-selection chooser, text input box, etc). For our example, we'll choose **Drop-down chooser** because we want users to choose from one of several pre-selected options. 7. Click **Save Custom Field** to advance to the next screen and customize your field type options (in our example, this means adding the choices that show up in the drop-down list we're creating). Custom field configuration form 8. After saving, you'll have the chance to add your drop-down list options on a new screen. ### Add field value options After clicking **Save**, you'll go to a new panel where you can add the options you want to appear in the drop-down chooser. Scroll to the bottom of the page to find a tabbed interface with two ways to add options: #### Add a single option Use the **Add a single option** tab to add options one at a time: 1. Type the **Name** of the option (for instance, "Contracts"). 2. Click **Add Option**. 3. Repeat to add additional choices. Adding custom field options #### Add multiple options at once Use the **Add multiple options** tab to add up to 50 options at once: 1. Click the **Add multiple options** tab. 2. Type or paste your options into the text area, with each option on its own line. 3. Click **Add options**. Broadstripes will add all valid options and skip any duplicates. You'll see a confirmation message indicating how many options were added and how many duplicates were skipped. #### Indicating a default option If you want a certain option to be selected automatically by default when your end users are entering a new contact in Broadstripes, check **Default** before saving that option. Setting a default option ### Change the order of the drop-down values 1. Once you are done adding all of your options, you can **click and drag** to re-order the way they will appear in the drop-down. 2. Just **click and hold** the row you want to move. When the correct row is selected (it will be highlighted in yellow), **hold and drag** it to the new spot. **Release** to drop it in place. Reordering custom field options 3. When you are done adding and rearranging your custom field options, click **Custom Fields** to see the new field you've created on the **Custom Fields overview** page. Completed custom field ## Edit, disable, or delete a custom field 1. Click the **Project settings** icon in the upper right-hand corner of the page (or press **Ctrl-K** / **⌘K**), then choose **Custom fields**. Custom fields index page 2. From the **custom fields index page**, you can see all the custom fields that have been created for your project. 3. You can also edit, disable, or delete a custom field from this page by clicking the actions menu () next to that field's name and choosing **Edit** (to edit or disable) or **Delete**. Edit and delete options for custom fields ## Edit a custom field 1. Click the actions menu () next to the name of the field you want to modify and choose **Edit**. 2. First, you'll be shown the **configuration options page**. 3. Here you can edit the **name**, **description**, whether or not the field is **enabled**, or choose to link the field to an **external system**. If you need more details, all these configuration options are covered in the "Create a custom field" section above. #### Field type cannot be edited You will not be able to change the field type of your custom field — field type is chosen when the field is created and cannot be altered later. 4. You can make changes to the configuration options, or leave the configuration as-is and advance to field options, by clicking **Save Custom Field**. 5. You'll be shown a second panel, where you can **add**, **edit**, **delete**, or **rearrange** the **Custom Field Options.** Field options are the actual choices shown in the field's drop-down list, multiple-selection chooser, sortable list, and so on. 6. Any changes you make will be saved as soon as you make them. 7. When your edits are complete, click the **Custom Fields** menu link to return to the custom field index page and see the changes you've made. Custom field editing completed ## Control who can see and edit a custom field Two settings on the custom field form let you restrict what basic users can do with a field's value. **Visible to admins only** — The field is hidden entirely from basic users. Only project admins can see or set the field's value. Use this for sensitive internal notes that organizers should not see. **Editable by admins only** — Basic users can see the field's current value, but cannot change it. When a basic user views a person or organization record, the field is displayed alongside a lock icon to indicate it is read-only. Use this when you want organizers to see a piece of information (for example, a classification imported from payroll) without being able to overwrite it. These two settings are mutually exclusive: a field cannot be both visible-to-admins-only and editable-by-admins-only at the same time. ### Editable-by-admins-only fields in the Call Center When a call script includes a custom field marked "Editable by admins only," callers see the field's current value displayed as plain text with a "(read-only)" label. The field is skipped when the script collects responses, so callers cannot inadvertently overwrite the value. ### Editable-by-admins-only fields and public forms Custom fields marked "Editable by admins only" do not appear in [public forms](/docs/admin-guides/public-forms/public-forms-overview). Public forms are filled out by people who are not project users, so read-only fields have no function there and are excluded automatically. ### Editable-by-admins-only fields and data imports A basic user with the **Can perform data imports** permission can still set or update admin-editable-only fields through a spreadsheet import. When you grant a basic user that permission, the confirmation dialog notes this capability explicitly so you can make an informed decision. ## Disable a custom field If a custom field's data is no longer relevant, but you aren't ready to delete it, the field can be disabled. Disabling a field means it is hidden from your users' view; you also won't be able to search or report on it. If you ever want to retrieve the data from a disabled field, just re-enable the field. The data will be viewable again and nothing will be lost. In this example, we'll be disabling a custom field named "Interests." 1. Start at the project's custom field index page: click the **Project settings** icon in the upper right-hand corner of any page (or press **Ctrl-K** / **⌘K**), then choose **Custom fields**. 2. Find the custom field you want to disable in the list, click the actions menu () next to its name, and choose **Edit**. Editing a custom field to disable it 3. This will take you to the custom field's edit page. 4. Locate the **Enabled checkbox** and **uncheck** it. Unchecking the enabled checkbox 5. At the bottom of the page, click **Save Custom Field**. 6. You'll be shown a second panel — just leave this as it is. 7. Click the **Custom Fields tab** to return to the custom field index page. Returning to custom fields overview 8. On the index page, you can see that your custom field is no longer enabled. Disabled custom field in the list ### What if I want to see the data again? The data in a disabled custom field remains in Broadstripes' database. Because it's disabled, it will disappear from data-entry forms, and it won't show up on reports. You also won't be able to search using values from that custom field as your search criteria. If you decide that you need to see the data again (or use it for a search or in a report), you can simply repeat the steps above. When you get to the custom field edit page (step 3), check **Enable** and save your change. The custom field's data will be viewable (and searchable) again. ### What if I have a calculated column based on a disabled custom field? If you have a calculated column whose search text refers to a disabled custom field, its results will be inaccurate because search criteria involving that custom field will not work as they used to. The column should be changed or deleted. ## Delete a custom field #### Deleting a custom field is permanent Deleting a custom field removes the field *and all its associated data* permanently from your project. If you want to keep a custom field and its associated data in your project, but want it hidden from your users' view, you should **disable** the field rather than delete it. Read more in the "Disable a custom field" section above. 1. Start at the project's custom field index page: click the **Project settings** icon in the upper right-hand corner of any page (or press **Ctrl-K** / **⌘K**), then choose **Custom fields**. 2. To permanently delete a custom field, click the actions menu () next to the name of the custom field you want to delete and choose **Delete**. 3. Broadstripes will ask you to confirm that you want to delete the field. Both the custom field and all data records held in the field will be deleted, and the deletion cannot be undone. 4. Click **OK** to remove the custom field and all associated data from your project. Deleting a custom field confirmation # Data tools overview Source: https://help.broadstripes.com/docs/admin-guides/data-tools/data-tools-overview Understanding the different custom data tools in Broadstripes and how to choose the right tool for your organizing needs ## Intro Many things influence the nature of a labor or community organizing campaign — the industry of the workers, the culture of the community, the goals of the campaign, and so on. Broadstripes has been built for maximum flexibility, to allow you to capture and work comfortably with the enormous variety of data that goes along with these different organizing needs. To take advantage of that flexibility, it helps to understand the different custom data tools the system contains, and the purposes for which they were intended. ## Where does the data belong? The first thing to do when setting up a new Broadstripes project is to figure out what data you need to capture about the workers to organize effectively. With any luck, you already have a pretty good take on this question through your organizing work or work with the organizers to date. The question facing you is where does this data belong in Broadstripes? Here is a short list of the options: * **Built-in fields:** data items associated permanently with people or organizations. A complete list with some explanations is provided in the [Built-in data](/docs/admin-guides/data-tools/built-in-data) article. * **Turf structure:** a customizable multi-level hierarchy intended to allow you to capture the way the organizers see the workplace (or "turf"). Turf structure can capture "shops," "departments," and "sub-departments," or "buildings" and "floors," or "cities" and "neighborhoods," or almost any other hierarchical information you have about where people work. * **Events:** one of the most commonly-used custom data types in Broadstripes. Events allow you to create a group of checkboxes that capture the status of a particular action or activity in the campaign. Some events track info that is highly time-specific (like confirming that a worker will attend an organizing meeting), while others help organizers check off each step of common campaign activities (like getting cards signed and putting them on file). Each of the specific yes/no questions captured with a checkbox is called an "event step." For instance, you might create an event named "Card" with steps named "Signed", "On file", and "Email sent." Events can be single or multiple-choice, and, if you want, events can also be tracked in the contact timeline. You can learn about creating and working with events in the [Events](/docs/admin-guides/data-tools/creating-an-event) article. * **Custom fields:** data that is permanently relevant about the worker (such as "Shift" and "Issues of Concern") is best captured in a custom field. Broadstripes allows you to create an unlimited number of text, numeric, date, true/false, and memo (longer text) custom fields. Custom fields can apply to people, organizations, or both. You can learn more about custom fields, how to create them, and how they differ from events in the [Custom fields](/docs/admin-guides/data-tools/custom-fields) article. * **External systems:** special fields created for capturing unique IDs from other database systems. Their advantage over custom fields is that they can be used for record-level matching during data import and updates. Learn more in the [External systems](/docs/project-settings/external-systems-settings) article.  * **Attachments:** if you have data files (images, PDFs) linked to your workers, they can be stored as attachments in Broadstripes. # Employment field and subfields Source: https://help.broadstripes.com/docs/admin-guides/data-tools/employment-field-and-subfields Understanding the built-in employment field and its subfields for tracking worker employment information The Employment field has many subfields. It is meant to provide you with a generic set of employee data fields that you are likely to find useful. However, depending on the structure of your workers' employments, you may find this section to be inadequate or not specific enough. In that case, you can use custom fields to record employment data instead. ## Employment subfields * **Department**: Department is a built-in subclassification of Employer. For instance, in a factory/warehouse your department might be Distribution. * **Classification**: Your worker's job title. Examples are Cashier, Attendant, Welder, etc. * **Employee number**: If the workplace uses a unique identification number to keep track of workers (Employee ID, Badge Number, etc.), you can enter that number here. * **Work location**: You can use this to name the building, floor, office, section etc. where your worker is located. * **Hours**: The number of hours per week that your person is scheduled to work. * **Hourly rate**: The worker's hourly wage rate. * **Employee status**: Current employment status of the worker. * **Start date**: When the worker first started at the company. * **Recent hire date**: Most recent hire date if the worker was rehired. * **Date last paid**: Last date the worker received payment. * **Seniority date**: Date used for calculating seniority within the organization. * **Bargaining unit member**: Checkbox to indicate if the worker is part of the bargaining unit. * **Full/part time**: Text field to specify whether the worker is full-time or part-time. # Leadership roles Source: https://help.broadstripes.com/docs/admin-guides/data-tools/leadership-roles Set up and manage leader roles to identify and track leadership within your organizing campaign ## Overview An important part of many kinds of organizing is the identification of **leaders** within the bargaining unit or worker group. Leadership is usually defined by roles. Labor organizing (internal or external) often uses "Committee" and "Key Leader," while "Activist" or "Mobilizer" are more common in community organizing. With Broadstripes, it is simple to set up leader roles to suit the style of organizing you're doing. ## Set up new leader roles Leader settings interface 1. Click the **Project settings** icon in the upper right corner of any page (or press **Ctrl-K** / **⌘K**), then choose **Leader roles**.\ This takes you to the **leader role index page** that lists any existing roles in your project. 2. Click on the button to add **+ New Leader Role**. 3. Give the new role a one- or two-word **name** that's meaningful to the organizers on your campaign. (This is the text that will appear on-screen and in reports.) 4. Add a **description** (optional). If your project has many roles, it can be useful to create a short descriptive sentence for each. 5. Enter a **position number**. The position number conveys where the role fits in the hierarchy of leadership. It determines where the role will appear in the leader role drop-down chooser as seen by your end users. When setting **position numbers**, a lower number means a higher position in the hierarchy, so a role with position 1 will appear at the top of the list, and so on. Leaving the number value as "0" will make Broadstripes automatically assign the next available number, placing your new role at the bottom of the list. 6. Check **Represents leadership** if you are creating some roles that do not represent leadership and wish to have the ability to distinguish between people in leadership roles and those with non-leadership roles. An example of a non-leadership role is a "Target," a person who may have influence in the bargaining but who has not yet committed to using that influence to support your campaign's goals. 7. Configure the **coverage settings** for this role. New leader roles open with both coverage checkboxes already enabled, so you only need to change these if you want different behavior for this role: * **Leaders are covered** — When checked, people with this role are counted as covered in Broadstripes' automatic calculation of coverage within the shop/department turf. (This organizing metric can be shown on the Turf Panel and added to status reports at your discretion.) * **Followers are covered** — When checked, the followers of leaders with this role are also counted as covered. For example, if a "Committee" leader has this option enabled, anyone assigned to that leader will automatically be counted as covered, even if they don't have a leadership role themselves. **Followers are covered** depends on **Leaders are covered**. If you uncheck **Leaders are covered**, the **Followers are covered** option is automatically cleared and disabled — followers cannot count as covered if their leaders do not. Re-checking **Leaders are covered** restores **Followers are covered** to checked. New Leader Role form with Represents leadership, Leaders are covered, and Followers are covered all checked by default, with Followers are covered indented under Leaders are covered 8. Click **Save Leader Role**. You'll be returned to the leader role index page where all your roles are listed. 9. Repeat these steps until you've created the roles you need. Your finished leader role list might look something like this: Leader roles index showing configured roles ## Manage roles in the grid The leader role index page is an interactive data grid. From here you can reorder roles, toggle settings inline, and access edit and delete actions without leaving the page. ### Reorder roles Drag any row by its handle on the left side to reposition it in the hierarchy. The **Position** column updates live to reflect the new order. Dragging is disabled while a column filter is active -- clear the filter first to re-enable reordering. ### Toggle settings inline Three columns can be toggled directly in the grid without opening the edit form: * **Represents leadership** -- Check or uncheck to control whether this role counts as a leadership role. * **Leaders are covered** -- Check or uncheck to control whether people with this role count as covered in Broadstripes' coverage calculations. * **Followers are covered** -- Check or uncheck to control whether the followers of leaders with this role also count as covered. This option is disabled when **Leaders are covered** is unchecked. Changes take effect immediately. If a save fails, the checkbox reverts to its previous value. ## Edit or delete your leader roles ### Edit 1. To **edit** a leader role, click the actions menu () at the right side of the role's name cell and choose **Edit**. 2. Make the changes you want, and click the **Save Leader Role** button. 3. You'll be returned to the **Leader role index page** where you can see your changes. ### Delete 1. To permanently **delete** a leader role, click the actions menu () at the right side of the role's name cell and choose **Delete**. 2. A confirmation dialog appears showing the role's name and, if any contacts hold that role, how many people will lose it. 3. Click **Delete** to confirm. The leader role is removed from your project, and any contacts who had it will have no leader role assigned. # Organizations Source: https://help.broadstripes.com/docs/admin-guides/data-tools/organizations Understanding the built-in data fields for organizations in Broadstripes Here's an outline of the built-in data fields for organizations in Broadstripes. ## Organization fields **Name**: The official name of the organization. **Parent organization**: If the organization you are creating is, for instance, a department or section within a larger organization, you can link it to its parent organization using this field. Searching with a keyword (e.g. "hospital") will return a list of organizations to choose from. You cannot create a new organization on this page; you must select an organization that has already been entered into Broadstripes, or else leave the field blank for now. **Nickname**: If the organization is commonly called something other than its official name, input it here. For instance, Saint Vincent Hospital's nickname could be "SVH." **Notes**: This is a simple text box for preserving information that does not fit neatly into a format, and also should not be its own custom field. Often notes are bits of information specific to the organization, for instance, "Floor 12 supervisor is Mary." **Website**: If the employer/organization has a website, it can be stored in this field. # Tags Source: https://help.broadstripes.com/docs/admin-guides/data-tools/tag-lists Create, manage, and use tags to manually group contacts for tracking and organizing. ## Overview Tags let you manually group contacts for any reason -- people who go on break together, key targets for outreach, volunteers who handed out flyers last week, or any other ad-hoc grouping. Once you create a tag, you can add or remove members, share it with other users, or make it inactive when you're done. ## The tags table Click **Tags** in the left navigation panel to open the tags page. Tags page showing an interactive data grid with columns for tag name, status, visibility, records tagged, creator, owner, and created date The table is an interactive data grid with sortable, filterable columns: | Column | Description | | --------------------- | ------------------------------------------------------------------------------------------------------------------- | | **Tag name** | The tag name, displayed as a colored badge, with an **actions menu** () for Edit and Delete | | **Active?** | A toggle switch -- blue means active, gray means inactive | | **Visibility** | Shared (visible to all users, shown in blue) or Personal (visible only to the owner, shown in green) | | **Records tagged** | Number of contacts with this tag -- click the number to view them in a new tab | | **Creator** | The user who created the tag | | **Owner** | The user who owns a personal tag (blank for shared tags) | | **Created date/time** | When the tag was created | The toolbar includes a **New tag** button and a **Transfer tag** button (enabled when you select one or more tags using the checkboxes). ## Create a tag 1. On the tags page, click **New tag**. 2. Fill in the fields in the dialog that opens: * **Name** -- A descriptive name for the tag. * **Color** (Optional): Choose a badge color from the preset palette, or switch to the **Custom** tab to enter any hex code. Leave blank to derive the color automatically from the tag name. * **Description** -- Optional notes about the tag's purpose. * **Visibility** -- **Shared** (visible to all project users) or **Personal** (visible only to you). 3. Click **Save**. The new tag appears in the table immediately without a page reload. ## Add or remove people The most common way to add or remove people from a tag is through bulk actions on search results. Search for the contacts you want, select them, and use the **Add tag** or **Remove tag** bulk action. See [Actions -- Add/remove tag](/docs/viewing-search-results-and-edit/bulk-actions/bulk-actions-list) for step-by-step instructions. ## View tag members Click the number in the **Records tagged** column to view all contacts with that tag. This opens a search results page filtered to show just the tag's members in a new tab. From the search results, you can apply a layout to see the columns most useful to your work. See [Create and save a layout](/docs/customize/save-a-layout) for more on layouts. ## Search for a tag You can search for a tag by typing `tag == "[name]"` into the search bar. This returns the contacts who have that tag. For example, to find everyone tagged "Steward", type `tag == "Steward"`. Quote the name when it contains spaces. ## Edit a tag 1. Click the **actions menu** () next to the tag name and select **Edit**. Tag actions menu showing Edit and Delete options 2. Update the name, color, description, or visibility as needed in the dialog that opens. Edit tag dialog showing name, description, and visibility fields 3. Click **Save**. You can only change the visibility of tags you created. If you're editing a tag created by another user, the visibility section shows a message instead of the Shared/Personal options. ## Make a tag inactive If a tag is no longer useful for daily work, you can make it inactive rather than deleting it. Inactive tags are hidden from dropdown menus and navigation, but their members are preserved. Click the toggle in the **Active?** column to switch the tag between Active and Inactive. The toggle updates immediately without leaving the page. To find inactive tags, use the **Active?** column filter and select **Inactive**. You can reactivate a tag by clicking its toggle again. ## Transfer a tag You can transfer one or more tags to another user. The transferred tag becomes a personal tag owned by that user and disappears from your view. 1. Select the tags you want to transfer using the checkboxes. 2. Click the **Transfer tag** button in the toolbar. 3. Search for and select the target user. Transfer tag modal with a user search field 4. Click **Transfer**. ## Tags in search results When a layout includes the **Tags (active)** column, each row shows colored badge buttons for every tag that person belongs to, grouped into **Personal tags** and **Shared tags** sections. Tags appear with the most recently assigned first. ### View a tag's details Click any tag badge to open a **summary card** for that tag. The card shows: * How many contacts are currently assigned to the tag, with a link to view them in a new tab. * When the tag was created and by whom, and when it was last used. * When the tag was applied to this specific contact, and by whom (for assignments made after assigner tracking was introduced). Tag summary card showing usage count, creator, and Remove/Edit tag actions ### Add or remove tags from a contact Users with edit permission see an **Add/edit tags...** button below the badges in each row. Clicking it opens the tag picker for that contact. The tag picker groups tags into bands: **Recently used** (your most recently assigned tags), **Selected** (already assigned to this contact), **Personal** (your unassigned personal tags), and **Shared** (unassigned shared tags). Click a row to assign or unassign a tag. Type in the filter field to search by name. Tag picker dialog showing recently used, selected, personal, and shared tag bands You can also remove a tag by clicking its badge to open the summary card, then clicking **Remove tag**. A confirmation toast with an **Undo** button appears so you can reverse the removal within a few seconds. ### Create a tag from search results To create a new tag directly from the search results page: * In the tag picker, type a name that does not match any existing tag and press **Enter**, or click the **Add...** row that appears below your typed text. * In a badge's summary card, click **New tag** in the top corner. Both paths open the tag editor where you set the tag's name, color, visibility, and description. After saving, the new tag is automatically assigned to the contact you opened it from. ### Edit a tag from search results Click any tag badge to open its summary card, then click **Edit tag** (non-readonly users only). This opens the tag editor where you can update the tag's name, color, visibility, or description. Changes apply everywhere the tag appears. ### Expand or collapse badges in a row If a person belongs to more than 12 lists, the cell shows the first 12 badges and a **+N more** button. Click **+N more** to reveal all badges for that row, then click **Show less** to collapse back. ### Expand or collapse all rows at once The **Tags (active)** column header includes two icon buttons: * **Collapse all** — collapses every row to show only the first 12 badges. * **Expand all** — expands every row to show all badges. Your choice is saved so it persists when you reload the page. Individual rows can still be toggled independently after setting the column-wide default. Tags (active) column header with collapse-all and expand-all icon buttons ## Tag lists in the Quick view The **Quick view** panel (opened by clicking the Quick view icon next to a contact's name in search results) includes a **Tags** section showing that contact's tag badges. Users with edit permission see the **Tags** heading as a clickable button with a pencil icon (). Clicking it opens the full tag picker for that contact (the same picker as the **Add/edit tags...** button in the search results row). Readonly users see the tags but no edit affordances. Clicking any tag badge in the Quick view opens the same summary card described in [View a tag's details](#view-a-tags-details) above, with the same **Remove tag**, **Edit tag**, and **New tag** actions available for users with edit permission. ## Delete a tag 1. Click the **actions menu** () next to the tag name and select **Delete**. 2. Confirm the deletion in the dialog that appears. Deleting a tag removes it permanently. The contacts themselves are not deleted, but the tag cannot be recovered. # Working with calculated columns Source: https://help.broadstripes.com/docs/admin-guides/data-tools/working-with-calculated-columns Create custom metrics that combine data from multiple Broadstripes fields for use in turf panels, layouts, and status reports. ## Overview Calculated columns let administrators create custom metrics by combining or manipulating data from multiple Broadstripes fields. They update automatically when underlying data changes and work like any other column once created. You can use calculated columns in: * **Turf panels** — show COUNT columns as donut progress bars and SUM/CHECKOFFCOUNT columns as large standalone numbers * **Status reports** — calculate totals, especially for time-based metrics like "cards signed in the last week" * **Search result layouts** — list multiple values in a single column, such as each leader's hostile workers ## The calculated columns table Click the **Project settings** icon in the upper right corner of any page (or press **Ctrl-K** / **⌘K**), then choose **Calculated columns**. You can start typing to filter the list. The settings page lists all calculated columns in your project. Calculated columns settings page showing a table of existing columns with name, calculation type, search text, and other details The table displays: | Column | Description | | ---------------------- | -------------------------------------------------------------------- | | **Name** | The column's display name | | **Calculation type** | The type of calculation (COUNT, SUM, CHECKOFFCOUNT, etc.) | | **Search Text** | The search query that defines what data to calculate | | **Applies To** | Whether the column applies to organizations, people, or all contacts | | **Show on Turf Panel** | A checkmark if the column appears on turf panels | | **Created By** | The user who created the column | | **Created At** | When the column was created | Each row includes **edit** and **delete** links. ## Create a calculated column 1. On the **Calculated Columns** settings page, click the **+ New Calculated Column** button. 2. Fill in the form fields: New Calculated Column form with fields for name, calculation type, search text, applies to, and show on turf panel * **Name** — A short, descriptive name your users will recognize (e.g., "Cards Signed" or "Hostiles Led"). Names must be unique within the project. * **Calculation type** — Choose how to calculate results: | Type | Description | | -------------------- | ---------------------------------------- | | COUNT | Total number of matching contacts | | SUM | Sum of a numeric custom field value | | CHECKOFFCOUNT | Count of completed event check-off steps | | FIRSTNAME | List of first names | | FULLNAME | List of full names | | FIRSTNAMELASTINITIAL | List of first names with last initial | | NAME | List of names | | HIERARCHICALNAME | List of names in hierarchical format | * **Custom field for SUM** — Appears when you select **SUM**. Choose which numeric custom field to sum. * **Events for CHECKOFFCOUNT** — Appears when you select **CHECKOFFCOUNT**. Choose which events to count check-offs for. * **Search text** — The search query that defines which contacts to include in the calculation. Use the **Insert a token** dropdown to add tokens. See [Search text and tokens](#search-text-and-tokens) below. * **Applies to** — Choose **Organization**, **Person**, or **All contacts**. This controls when the column displays data. For example, if set to **Organization**, the column only shows values when viewing an organization; it is blank for people. * **Show on turf panel** — Check this box to display the column on all users' turf panels. COUNT columns appear as a donut progress bar (showing count and percentage); SUM and CHECKOFFCOUNT columns appear as a large standalone number. This option is only available when **Applies to** is set to **Organization**. 3. Click **Save Calculated Column**. ## Search text and tokens The **Search text** field uses the same search syntax as the Broadstripes search bar. You can combine any search terms with special **tokens** — placeholders inside `{curly brackets}` — that tell Broadstripes how to group and calculate results. ### Available tokens Use the **Insert a token** dropdown to add these tokens to your search text: | Token | Purpose | | --------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | | `{contact-broadstripes-id}` | Groups results by the unique contact ID. Use with field references like `employer =` or `leader =` to calculate per-contact. | | `{contact-name}` | Substitutes the contact's name into the search. | ### Common search text patterns **Count by employer (e.g., cards signed per location):** ``` cardsigned=yes employer={contact-broadstripes-id} ``` **Count with a time window (e.g., cards signed in the last week):** ``` employer = {contact-broadstripes-id} cardsigned > "one week ago" ``` Broadstripes understands natural language date phrases in search text, such as "one week ago," "two months ago," or "yesterday." **List names by leader (e.g., hostile workers per leader):** ``` code > 2 leader = {contact-broadstripes-id} ``` ## Edit a calculated column 1. On the **Calculated Columns** settings page, click **edit** next to the column you want to change. 2. Update the form fields as needed. Edit Calculated Column form with fields populated 3. Click **Save Calculated Column**. ## Delete a calculated column 1. On the **Calculated Columns** settings page, click **delete** next to the column you want to remove. 2. A confirmation page appears. Click **Delete \[column name]** to permanently remove the column, or **Cancel** to go back. Deleting a calculated column removes it from all turf panels, layouts, and status reports that use it. This action cannot be undone. ## Using calculated columns Once created, calculated columns are available wherever you can select columns in Broadstripes. ### On the turf panel If you check **Show on turf panel** when creating a column, it automatically appears on all users' turf panels. How it displays depends on the calculation type: COUNT columns show as a donut progress bar with the count and percentage; SUM and CHECKOFFCOUNT columns show as a large standalone number (since their totals don't represent a share of the worker count). ### In status reports To add a calculated column to a status report: 1. Click the **Project settings** icon in the upper right corner of any page (or press **Ctrl-K** / **⌘K**), choose **Status report definitions**, then click **edit** on the report you want to modify. 2. Click the **Columns** tab. 3. Select your calculated column from the **Calculated columns** section under **Available Columns**. 4. Configure the column label, orientation, and display format (count or percentage). 5. Click **Save**. ### In search result layouts To add a calculated column to a search layout: 1. Run a search to display results. 2. Choose **Modify layout** from the **Layout** dropdown menu. 3. Click on your calculated column under **Other available columns** to add it. 4. Click **Save changes**. # Bouncing emails Source: https://help.broadstripes.com/docs/admin-guides/public-forms/bouncing-emails Find and re-enable BCC recipients on your public forms that email providers are rejecting ## Overview The Bouncing emails page shows every email address that is currently undeliverable on your project's public forms. When an address you've added to a form's "Other recipients" (BCC) list starts bouncing -- meaning the email provider is rejecting messages to it -- Broadstripes records it here and stops sending to that address until you clear the suppression. Use this page to see which addresses are affected, understand why they're bouncing, and re-enable delivery once the mailbox issue is fixed. ## Accessing the Bouncing emails page 1. Click the **Project settings** icon in the upper right corner of any page (or press **Ctrl-K** / **⌘K**). 2. Choose **Bouncing emails**. You can start typing to filter the list. The page lists all BCC addresses on your project's public forms that are currently blocked. If no addresses are blocked, the table is empty. Bouncing emails page showing undeliverable BCC addresses ## Understanding the table Each row represents one blocked email address. The table includes the following columns: | Column | Description | | ----------------- | --------------------------------------------------------------------------------------------------------------------------------- | | **Email address** | The blocked address. | | **Action** | A **Re-enable delivery** button, plus a counter showing how many re-enable attempts have been used. | | **Last bounce** | When the most recent delivery failure was recorded. | | **Failures** | Total number of delivery failures recorded for this address. | | **Source** | Which public form (or forms) has this address in its "Other recipients" list. Each source links directly to that form's settings. | | **Reason** | The reason code reported by the email provider, if available. | The table supports sorting and filtering on all columns. Use the **Source** filter to find all bouncing addresses related to a specific form. ## Re-enabling delivery When a mailbox is fixed -- the address is corrected, the inbox is no longer full, or the provider has cleared its block -- you can ask Broadstripes to remove the suppression: 1. Find the address in the table. 2. Click **Re-enable delivery** in the Action column. 3. Confirm the action in the dialog that appears. Broadstripes submits a job to clear the address from the email provider's suppression list. The button changes to **Re-enable requested** while the job runs. No email is sent at this point -- once the suppression clears, future public form submissions will resume delivering to that address. Re-enabling delivery does not guarantee future messages will be accepted. If the underlying mailbox problem is not resolved, the address may bounce again and re-enter the suppression list. ### Re-enable limit Each address has a limit on how many times delivery can be re-enabled. The Action column shows the current count (for example, "1 of 3 re-enables used"). When the limit is reached: * **Regular users** see the button disabled. The counter shows "Max re-enables used" and a warning icon appears. Consider correcting or removing the address from the form's "Other recipients" field. * **Project group admins** can re-enable past the limit, but a warning tooltip notes that the address may be permanently undeliverable. Use judgment before re-enabling repeatedly. ## Fixing the underlying problem Re-enabling delivery clears the suppression, but the address may bounce again if the root cause is not resolved. Common causes and fixes: * **Invalid address**: Correct the address in the form's Confirmation email tab > "Other recipients" field. * **Full mailbox**: Ask the recipient to clear space, then re-enable. * **Domain not found**: The domain no longer exists or was misspelled -- correct the address. * **Spam block**: The recipient's mail server blocked Broadstripes as spam -- contact Broadstripes Support if this persists. To update an address in a form, click the form name in the **Source** column to go directly to that form's settings. ## Relationship to the per-form Email tab The Bouncing emails page is an aggregated view across all forms in the project. Each individual public form's **Confirmation email tab** also shows its own bouncing "Other recipients" addresses -- you can re-enable delivery from there too. Use whichever view is more convenient: * Use the **Bouncing emails page** to see all blocked addresses across all forms at once. * Use the **Confirmation email tab** to see and fix issues while editing a specific form. ## Next Steps * [Confirmation email tab](./email-tab) -- Configure "Other recipients" and other email settings for a public form. * [Public forms overview](./public-forms-overview) -- Learn how public forms work. * [Viewing and downloading public forms](./viewing-and-downloading-public-forms) -- See and download submitted form PDFs. # First step: create a new public form Source: https://help.broadstripes.com/docs/admin-guides/public-forms/create-public-form Learn how to create and name a new public form for collecting digital membership cards and other data ## Public forms creation On the first page in this series, the [public forms overview page](./public-forms-overview), we looked at some of the different ways public forms could be used. In this documentation, we'll create a public form to capture signed digital cards submitted by the members of a bargaining unit. To accomplish this we will need to: 1. Navigate to the Public forms page 2. Click the New Public Form button for a person 3. Name and configure the form 4. Select fields to include on the form Before you start, think about whether the form you want to build will, when submitted, create or update a person record or an organization record (i.e. a shop or department) in Broadstripes. In most cases, public forms are used to create or update people, not organizations. Therefore, this documentation describes the creation of a digital card public form for a person. ## Step 1: Navigate to Public forms To create a public form, you must be an admin in your project. As with most admin-only functionality, Broadstripes' **Public forms** index page is accessible from the Project settings menu. 1. Click the **Project settings** icon in the upper right corner of the app (or press **Ctrl-K** / **⌘K**) 2. Start typing "Public forms" to filter the list 3. Click the **Public forms** option The Public forms index page displays a table of all your public forms with columns for name (with an actions dropdown menu where you can edit, duplicate, or delete an existing form), type (person or organization), link (copy or go to the URL to the form), enabled status (whether the form is enabled or disabled), submissions (how many times the form has been submitted), and creation information. ## Step 2: Start creating the form On the Public forms index page, click one of the buttons to create a form: * **New person form** - For individual contacts (workers, volunteers, members) * **New org form** - For organization contacts (shops, departments, companies) These buttons appear both at the top and bottom of the Public forms page. Most campaigns use person forms for worker sign-ups and organizing. Organization forms are less common and typically used for employer/shop data collection. This documentation focuses on creating a person form. You should now see the Public form editor. ## Step 3: Name your public form The next step in building our form is to name it and configure basic settings in the public form editor. Type the name of your form into the **Name** field input box. **Choosing a good form name:** The form name appears in the Broadstripes interface and helps you identify the form in the list. It does NOT appear on the public form itself (unless you do not indicate a form header). Examples of good form names: * "2025 Worker Interest Card" * "Training Registration - March" * "Shop Steward Application" * "Volunteer Sign-Up" * "Digital Membership Card" Examples of names to avoid: * "Form 1" (not descriptive) * "Test" (unclear purpose) * Generic names like "Card" (specify the year or campaign) ## Step 4: Enable the form for public access Below the name field, the public-access card shows the **Enable this form for public access?** toggle, a **Live** or **Not public** status pill, and the form's permanent **public form link**. Make sure the toggle is on. **If it is off, the form is inactive. Anyone who uses the permanent URL associated with this public form will not be able to complete the form.** When enabled: * The form is accessible via its public URL * Anyone with the link can open, complete, and submit the form * Form submissions are processed and create/update contacts When disabled: * The form URL shows an error message * No submissions can be made * Useful for temporarily pausing submissions or testing changes **Important:** You can enable/disable forms at any time from the Public forms index page by toggling the checkbox in the Enabled column. ## Step 5: Configure duplicate matching Below the public-access card, you'll see the **Attempt to match existing contacts** toggle. When enabled (recommended): * Broadstripes searches for existing contacts with matching email or phone number * If found, the form submission updates the existing contact instead of creating a duplicate * If not found, a new contact is created * Helps keep your project data clean When disabled: * Always creates a new contact * May result in duplicate contacts if someone submits multiple times **How matching works:** The matching process uses name fields and contact information (email and/or phone) to identify existing contacts. Name-matching uses "fuzzy logic," so "Thomas" will match "Tom" and "Tommy." At least one contact method (email OR phone) must match along with the name for a record match to be found. If a match is found, the records are merged intelligently: * Single-value fields (like assessment or custom dates) are updated with the new value * Multi-value fields (like phones or emails) preserve both old and new values ## Step 6: Review the Form status panel Below the matching toggle, the **Form status** panel summarizes two signals about how the form will behave. Hover over the **info icon** () next to either line for details. Form status panel with the email confirmation info popover open **Record-matching: ON/OFF** * Reflects the matching toggle above * The info popover explains the fuzzy name matching logic and which fields are used for matching **Email confirmation to form submitter: YES/NO/MAYBE** * Shows whether submitters will receive a confirmation email, based on your settings in the [Confirmation email tab](./email-tab) * MAYBE means the form does not require an email address, so a copy is sent only when the submitter provides one * The info popover notes NLRB compliance requirements for authorization cards ## Step 7: Understand the form editor tabs The form editor has a tabbed interface with six tabs — person forms show a **Workplace** tab, and organization forms show an **Organization** tab in its place. You'll configure different aspects of your form in each tab: 1. **Standard fields** - Select which standard fields appear on the form 2. **Timeline** - Configure automatic timeline entry creation 3. **Workplace** - Set up employer information collection (person forms only) 4. **Organization** - Allow submitters to select an existing organization from the project (organization forms only) 5. **Content and attachments** - Customize logo, header, introduction, legal text, signature field, and file attachments 6. **After submission** - Set the confirmation message, event steps, contact type, and PDF settings 7. **Confirmation email** - Configure confirmation emails to submitters and others The Standard fields tab is selected by default when you first create a form. ## Step 8: Save your initial configuration At this point, you might want to click the **Save** button at the bottom of the page. This will: * Save the form with the name you entered * Preserve the enabled/disabled status * Generate the permanent public form URL * Return you to the main Public forms page (index page) **Why save now?** * Ensures your form is created with the correct name * Allows you to see the generated public URL * Prevents losing work if your session times out * You can continue editing later You can continue editing without saving by moving to other tabs. All changes across all tabs are saved together when you click Save. However, it's good practice to save periodically, especially when making significant changes. ## Next steps: Customize your form Your form has been created and is ready to be customized. The next step is to indicate which fields you want on your form. The best place to start is the [The "Standard fields" tab](./standard-fields-tab-in-public-form). The following articles discuss the functional details of each tab on the public form editor: **Configure what information to collect:** * [The "Standard fields" tab](./standard-fields-tab-in-public-form) - Choose contact info fields, custom fields, and events * [The "Timeline" tab](./timeline-tab) - Create timeline entries for organizing interactions * [The "Workplace" tab](./employment-tab) - Collect employer/workplace information (person forms only) * [The "Organization" tab](./organization-tab) - Allow submitters to select an existing organization (organization forms only) **Customize appearance and communications:** * [The "Content and attachments" tab](./form-content-tab) - Add logo, header text, introduction, legal agreement, signature field, and file attachments * [The "Confirmation email" tab](./email-tab) - Set up confirmation emails with optional PDF attachments **Configure after-submission options:** * [The "After submission" tab](./other-options-tab) - Set the confirmation message, event steps, contact types, and PDF settings **Manage and share your form:** * [Viewing and downloading public forms](./viewing-and-downloading-public-forms) - Access the public URL, test the form, and track submissions # Confirmation email tab Source: https://help.broadstripes.com/docs/admin-guides/public-forms/email-tab Configure email notifications and confirmations for public form submissions # Overview The Confirmation email tab configures automatic email notifications sent when someone submits your public form. You can send confirmation emails to form submitters, notify employers, and alert your organizing team--all automatically. Email confirmations serve multiple purposes: * Confirm receipt of the form submission * Provide transparency to form submitters * Meet NLRB compliance requirements (for union authorization cards) * Notify relevant parties (organizers, employers, administrators) * Include PDF copies of signed forms ## Configure email notifications for your public form Follow these steps to set up email notifications: ### Step 1: Navigate to the Confirmation email tab To get started, select the **Confirmation email tab** in the public form editor. ### Step 2: Choose who receives emails At the top of the Confirmation email tab, you'll see **"Email recipients"** with recipient options that vary by form type. All forms show the form submitter option; organization forms show additional leader notification options; person forms show an employer notification option. #### The form submitter (required for NLRB compliance) Check this box to send a confirmation email to the person who submitted the form. When enabled: * An email is sent to the form submitter's email address * Email uses the subject and body you configure below * Can include form data and/or PDF attachment * Serves as confirmation that the form was received When disabled: * No email is sent to the submitter * Not recommended for most campaigns **NLRB compliance note:** For union organizing campaigns, NLRB regulations require that you provide form submitters with a copy of what they signed. Enabling this option and attaching a PDF satisfies this requirement. **Best practice**: Always enable this option. It provides transparency, builds trust, and confirms to submitters that their form was received. #### The organization's direct leader (if any) (organization forms only) Check this box to send a notification email to the submitted organization's direct leader when the form is submitted. This option only appears for **organization forms**. When enabled: * An email is sent to the primary email address of the organization's assigned leader in Broadstripes * The email uses the same subject, body, and attachment settings as the submitter confirmation email * If the organization has no leader assigned, or if the leader has no primary email address, no email is sent When disabled: * No notification is sent to the organization's direct leader **When to enable**: * Forms where the organization's own leader should be notified of each submission * Workflows where the direct leader needs to act on or acknowledge the submission #### The organization's indirect leaders (people who lead parent orgs, if any) (organization forms only) Check this box to send a notification email to the leaders of the submitted organization's parent organizations in the hierarchy. This option only appears for **organization forms**. When enabled: * An email is sent to the primary email address of each leader of the organization's ancestor organizations * Leaders at multiple levels of the hierarchy receive the email (deduped so no one receives it twice) * If no ancestor organizations have leaders with email addresses, no email is sent When disabled: * No notification is sent to leaders of parent organizations **When to enable**: * Campaigns where regional or national leaders need visibility into local submissions * Hierarchical organizing structures where parent-org leadership tracks activity from child organizations #### The specified employer Check this box to send an email to the employer organization. This option only appears for **person forms** and only works when employment creation is enabled (see Workplace tab). When enabled: * An email is sent to the employer organization selected upon submission * Email is sent to the organization's primary email address in Broadstripes * Uses separate subject and body when **Use different content options for the employer email** is checked (configured in "Employer email content" section below) When disabled: * No employer notification is sent **When to enable**: * Shop steward election forms (to notify management) * Forms where the employer needs to be informed **When to disable**: * General organizing (you don't want to tip off the employer) * Interest cards (employer doesn't need to know) * Most worker sign-ups See the [Workplace tab](./employment-tab/) to enable and configure employment creation. If employment creation is disabled, this email option won't work because there's no employer to notify. #### Use different content options for the employer email Check this box if you want to customize the email sent to employers differently from the email sent to form submitters. When enabled: * A separate "Employer email content" section appears below * You can customize employer emails with different subject, body, and attachment options When disabled: * Employer emails (if enabled) use the same content as submitter emails * Simpler configuration **When to enable**: Almost always, if you're sending employer emails. Employers need different information than form submitters. ### Step 3: Add other email recipients (optional) In the **"Other recipients"** field, you can enter additional email addresses to receive a copy of the confirmation email. **Format**: Enter email addresses separated by commas or semicolons **Examples**: ``` organizer@union.org, admin@union.org john@union.org, sarah@union.org, campaigns@union.org ``` **Inline validation**: As you type, Broadstripes highlights any addresses that do not look valid. The field border turns red and a message lists the specific tokens that failed -- for example, "This doesn't look like a valid email address: badentry". The form will not save while invalid addresses are present. **Common uses**: * Notify organizers when new sign-ups come in * Send copies to campaign staff * Alert support staff for follow-up * BCC campaign leadership **Best practices**: * Don't add too many recipients (creates email overload) * Consider using a shared inbox (like [campaigns@union.org](mailto:campaigns@union.org)) instead of individual addresses * Recipients get the SAME email as the form submitter ### Undeliverable recipient addresses If Broadstripes detects that an address in your **Other recipients** list is undeliverable -- meaning your mail service is dropping messages to it -- a warning appears directly below the Other recipients field on the Confirmation email tab. Common causes include a misspelled address or a mailbox that no longer exists. When an address is flagged as undeliverable: * An amber warning icon appears next to the form name on the Public forms list page. * An amber warning icon also appears on the **Confirmation email** tab label in the form editor, so you can spot the problem without opening the tab. * Inside the tab, a warning panel beneath the Other recipients field lists each affected address and confirms that messages to it are being dropped. **Email notification**: Project group admins and the creators of any affected forms receive an email notification when Broadstripes first detects that an address is undeliverable. #### What to do The recommended action is to correct or remove the undeliverable address from the **Other recipients** field. Open the form's Confirmation email tab, update the field, and save. If the address is correct and the mailbox has recently been fixed, you can attempt to re-enable delivery from the warning panel: 1. Open the form's Confirmation email tab. 2. Find the amber warning panel beneath the **Other recipients** field. 3. Click **Re-enable delivery** next to the address. Broadstripes submits a request to clear the address from your mail service's suppression list. A confirmation message appears immediately; the warning clears the next time you reload the page once the re-enable request succeeds. The button label changes to **Re-enable requested** after you click it and stays disabled for the rest of your session, even if the request fails. This prevents accidental double-clicks that would consume your retry allowance. Reload the page to re-evaluate the status. **Retry limits**: Each address can be re-enabled up to 2 times. Once that limit is reached, the **Re-enable delivery** button is disabled for users without project group admin access. Project group admins can retry past the limit, but an advisory icon remains as a reminder that the address may be permanently undeliverable. If retries are exhausted, correct or remove the address. Warning panel shown below Other recipients when a BCC address is undeliverable ### Step 4: Configure email content options The Email content section controls what gets included in the confirmation email to form submitters. **Append form content to email body** Check this box to include the submitted form data at the bottom of the email body. When enabled: * The submitted form data is included at the bottom of the email body * Shows field labels and values in a readable format * Provides a text version of what was submitted When disabled: * Email only contains your custom message * Cleaner, shorter email **Best practices**: * Enable this if you're NOT attaching a PDF (provides a record of submission) * Disable this if you ARE attaching a PDF (prevents duplication) * Enable for simple forms where seeing data inline is helpful **Attach PDF of form to confirmation email** Check this box to attach a PDF copy of the form submission to the confirmation email. When enabled: * A PDF is generated containing all submitted form data * PDF is attached to the confirmation email * PDF includes all fields, signature (if captured), and form branding When disabled: * No PDF attachment (email only contains text) **Best practices**: * Enable for union authorization cards (NLRB compliance) * Enable for legal documents or contracts * Enable for applications where users need a copy * Disable for simple interest cards or casual sign-ups (faster processing, smaller emails) PDFs are always generated and stored in Broadstripes, even if you don't attach them to emails. This option only controls whether the PDF is attached to the email. ### Step 5: Write the email subject and body Customize the confirmation email message that form submitters will receive. **Subject line** In the **Subject** field, enter the subject line for the confirmation email. **Examples**: * "Thank you for your interest in organizing" * "Your worker interest card has been received" * "You're registered for the March meeting" * "Welcome to the campaign" * "Confirmation: Your application has been submitted" **You can use merge fields** to personalize the subject line and body (see Merge Fields section below): ``` Thank you, %first_name%! Your registration for %event_name% is confirmed ``` **Email body** In the **Message** field (large text area), enter the main content of the confirmation email. **Default**: If left blank, a generic message is sent **Example email body**: ``` Hello %first_name%, Thank you for filling out our worker interest card. An organizer will contact you soon to answer your questions and discuss next steps. In the meantime, you can visit our website at www.ourcampaign.org to learn more about our efforts. In solidarity, The Organizing Committee ``` **Best practices**: * Start with a personalized greeting using %first\_name% merge field * Thank the submitter * Set clear expectations about next steps * Provide contact information if they have questions * Include relevant links (website, Facebook group, etc.) * Sign with organization name or organizer name * Keep it brief—most people skim emails ### Step 6: Configure employer email content (if applicable) This section only appears if you enabled both "Send email to employer" and "Use different content options for the employer email" checkboxes in Step 2. **Append form content to employer email body** Check this box to include the submitted form data in the email sent to the employer. **Common configuration**: * Enable for payroll deductions (employer needs to see the details) * Disable for most other uses (employer doesn't need all the details) **Attach PDF of form including signature image** Check this box to attach a PDF of the full form submission to the employer email. When enabled: * PDF of the full form submission is attached to the employer email * Includes signature image if captured When disabled: * No PDF attachment **Employer email subject** In the **Subject** field under Employer email content, enter the subject line for emails sent to employers. **Examples**: * "Shop steward election notice" * "Employee authorization form submitted" * "New grievance filed by %name%" **Merge fields**: Same merge fields available as for submitter emails **Employer email body** In the **Message** field under Employer email content, enter the main content of the email sent to employers. **Example employer email body for shop steward election**: ``` This is to notify you that %name% has been elected as shop steward for %department%. As required by the collective bargaining agreement, management must be notified of shop steward elections. For questions, contact the union at admin@union.org. ``` ### Step 7: Save your work Once you've configured your email settings, click **Save** or move on to the next tab to continue customizing your form. ## Merge Fields Merge fields are placeholders that get replaced with actual data when the email is sent. **Available merge fields:** * **Name** - Full name of the recipient (or form submitter in this case) * **First Name** - Recipient's first name * **Nickname or First Name** - Uses nickname if available, otherwise first name * **Title and Last Name** - Recipient's title (if available) and last name * **Broadstripes ID** - Unique identifier for the recipient * **Organizer Name** - Full name of the recipient's assigned organizer * **Organizer First Name** - First name of assigned organizer * **Department** - Recipient's department (if employment data exists) * **Employer** - Recipient's employer organization * **Sender Name** - Your full name (the person sending the email) * **Sender First Name** - Your first name * Custom fields specific to your project may also appear **How to use merge fields**: 1. Click in the **Subject** or **Message** field to place your cursor, then click the ** Merge field** button above the message area and choose the field you want. The button shows which field it will insert into, and you can type in the popover's filter box to narrow the list. 2. Or manually type the merge field surrounded by percent signs (%) 3. The merge field is replaced with actual data when the email is sent **Example without merge fields**: ``` Thank you for your interest! An organizer will be in touch soon. ``` **Example with merge fields**: ``` Hello %first-name%, Thank you for expressing interest in organizing at %employer%. An organizer will contact you at %phone% within 48 hours. ``` **Best practices for merge fields**: * Don't overuse—too many merge fields feels robotic * Remember some fields may be blank—structure your message so it still makes sense ## Email Configuration Examples **Basic Interest Card** **Send email to**: * ☑ The form submitter * ☐ The specified employer * Other recipients: [campaigns@union.org](mailto:campaigns@union.org) **Email content**: * ☐ Append form content to email body * ☐ Attach PDF to email * Subject: "Thank you for your interest, %first-name%" * Body: ``` Hello %first-name%, Thank you for filling out our interest card. An organizer will contact you soon to answer your questions. In solidarity, The Organizing Committee ``` *** **Union Authorization Card (NLRB Compliant)** **Send email to**: * ☑ The form submitter (required for NLRB compliance) * ☐ The specified employer * Other recipients: [organizers@union.org](mailto:organizers@union.org) **Email content**: * ☐ Append form content to email body * ☑ Attach PDF to email (NLRB requirement) * Subject: "Your union authorization card" * Body: ``` Hello %first-name%, Thank you for signing a union authorization card. Attached is a copy for your records. Your signature authorizes the union to represent you. You have the right to revoke this authorization at any time by contacting us at revoke@union.org. If you have questions, call us at (555) 123-4567. In solidarity, Local 1979 ``` *** **Simple Event Registration** **Send email to**: * ☑ The form submitter * ☐ The specified employer * Other recipients: [events@union.org](mailto:events@union.org) **Email content**: * ☐ Append form content to email body * ☐ Attach PDF to email * Subject: "You're registered for %event-name%" * Body: ``` Hi %first-name%, You're all set for the March member meeting! When: March 15, 2025 at 6:00 PM Where: Union Hall, 123 Main Street We'll send you a reminder 24 hours before the event. See you there! ``` ## Email Delivery Notes **Timing**: Emails are sent within a few minutes of form submission (not instant, but very fast) **From address**: Emails are sent from your organization's outgoing email address on behalf of your organization (Please reach out to support to ensure your email address is configured correctly) **Reply-to**: The reply-to address is set to your organization's email (if configured) **Testing**: Always submit a test form before launching to verify emails are sent and formatted correctly ## Best Practices **Always send submitter confirmation**: Builds trust and provides transparency **Keep emails brief**: Most people skim emails on their phones **Set clear expectations**: Tell people what happens next and when **Test thoroughly**: Submit test forms and check that emails are received and formatted correctly **Use personalization wisely**: Merge fields are great, but don't overdo it **Consider mobile**: Many people will read these emails on their phones **Proofread carefully**: Emails go out automatically—typos affect many people **Include contact information**: Give people a way to ask questions or get help ## Next Steps * [The "After submission" tab](./other-options-tab) - Configure the confirmation message, event steps, contact type, and PDF settings * [The "Content and attachments" tab](./form-content-tab) - Customize the form's appearance and enable file uploads * [Viewing Forms](./viewing-and-downloading-public-forms) - See what your form looks like to users * [The "Standard fields" tab](./standard-fields-tab-in-public-form) - Return to field selection # Workplace tab Source: https://help.broadstripes.com/docs/admin-guides/public-forms/employment-tab Configure employment relationships and associations for your public form submissions # Overview The **Workplace** tab allows you to create an employment relationship for each form submission. If you prefer not to, you can skip this tab and use the default settings. The Workplace tab only appears for **person forms**. Organization forms do not have this tab. ## Why Collect Employment Information? Employment relationships are central to labor organizing campaigns. Collecting employer information lets you: * Link workers to their employers (shops, departments, companies) * Build shop lists and organizational charts * Identify shop leaders and organizers * Generate shop-specific reports * Send targeted communications to specific workplaces * Track organizing progress by location ## Create an employment relationship on your public form Follow these steps to configure employment collection on your public form: ### Step 1: Navigate to the Workplace tab To get started, select the **Workplace tab** in the public form editor. ### Step 2: Enable employment creation To include employment information, turn on the toggle in the **Workplace** card at the top of the tab ("Enable the worker submitting the form to identify where they work"). The record connected to the form submission will now be **associated with an employer**. The rest of the tab's options stay grayed out until this toggle is on. Workplace card with its toggle switched on at the top of the Workplace tab When enabled: * An "Employer" field appears on the public form * The submitter provides their employer information * An employment relationship is created automatically * The worker is linked to the organization in Broadstripes When unchecked, no employer information is collected. ### Step 3: Create a custom label Create a descriptive label for the employment input section using the **Custom label** field. **Default**: "Employer" **Custom label examples**: * "Where do you work?" * "Your employer" * "Company name" * "Shop name" * "Worksite" Choose language your audience will understand. "Where do you work?" is clearer than "Employer" for most workers. ### Step 4: Choose the matching method Next, use the **"Choose the method by which the workplace for the employment will be identified:"** dropdown. This dropdown controls HOW workers will identify their employer on the form. Four options are available: #### Tiered drop-downs The form recipient will select their employment information via drop-down menus, starting with the highest level of employment and then department and subdepartment, if applicable. **How it works**: * Multiple dropdown menus appear on the form * First dropdown shows parent organizations * Second dropdown shows child organizations within the selected parent * Additional dropdowns may appear for deeper hierarchies **Best for**: * Campaigns with clear organizational hierarchies * Large employers with multiple locations or departments **Example**: * First dropdown: Select your division (Northeast, Southeast, Central, West) * Second dropdown: Select your facility (lists facilities in chosen division) **Advantages**: * Prevents typos and variations in employer names * Forces structured data entry * Easy for workers when hierarchy is clear **Disadvantages**: * Can be slow if hierarchy is deep or complex * May confuse workers unfamiliar with the corporate structure #### External system Broadstripes will use the [external system](/docs/project-settings/external-systems-settings) you choose to make an employment association. You will also choose which external system value will be matched. **How it works**: * A single text input field appears * Worker enters an identifier from an external system (employer ID, shop number, etc.) * Broadstripes matches the identifier to an existing organization **Configuration**: When you select this option, you must also select which external system to use from the **"Choose the external system value that will entered to match the workplace:"** dropdown. This shows all external systems configured for your project. **Best for**: * Workers who know their employer ID or shop code * Campaigns with integrated payroll or HR systems * When you've imported organization data with external IDs **Example**: * Custom label: "Employee ID" * External system: "Payroll System" * Worker types: "E12345" * Broadstripes finds the organization with external system ID "E12345" **Advantages**: * Fast for workers who know their ID * Works well with HR system integrations **Disadvantages**: * Workers must know their ID * Requires external system setup in Broadstripes * Creates errors if worker enters wrong ID #### Autocomplete Broadstripes will automatically match existing shops/departments to recipients' input. **How it works**: * A single text input field appears with autocomplete * As the worker types, matching organization names appear * Worker selects their employer from the list * Matches against organization names at ALL levels of hierarchy **Best for**: * Campaigns with many employers * Workers who know their employer's name but not the formal hierarchy * Mobile-friendly forms (less tapping than tiered dropdowns) **Example**: * Worker types "acme" * Autocomplete shows: "Acme Corporation", "Acme West", "Acme Manufacturing" * Worker selects the correct one **Advantages**: * Fast and intuitive * Works on mobile devices * No need to understand organizational hierarchy **Disadvantages**: * May show too many results for common names #### Autocomplete, matching only against the lowest level of shop structure A form of auto-matching that will only match on departments at the lowest level (works best for projects with unique department names). **How it works**: * Same as Autocomplete above, but... * ONLY matches organization names at the lowest (leaf) level of the hierarchy * Excludes parent organizations from autocomplete results **Best for**: * Campaigns where workers should only be employed at specific locations, not parent companies * Avoiding confusion between "Acme Corporation" (parent) and "Acme Plant 3" (actual worksite) * Ensuring workers are linked to the most specific level **Example**: * Organization hierarchy: Acme Corp → Acme Northeast → Acme Plant 3 * Regular autocomplete would show all three when typing "acme" * Leaf node autocomplete ONLY shows "Acme Plant 3" **Advantages**: * Prevents workers from selecting parent organizations inappropriately * Ensures precise location data * Cleaner autocomplete results **Disadvantages**: * Requires well-structured organization hierarchy in Broadstripes * May not show any results if hierarchy isn't set up correctly * Can confuse workers if the "leaf node" isn't how they think of their employer ### Step 5: Configure employer email notifications (optional) A form can be set to automatically send the employer a copy of the recipient's form submission. You will configure this option on the [Confirmation email tab](./email-tab). This will require you to have contact information for the employer in your project, specifically an email address. See the Confirmation email tab to enable automatic email messages to employers and others after form submission. ### Step 6: Enable multiple employments (optional) Under the **Multiple employments** heading, check the **"Enable submitters to identify multiple workplaces (creating multiple employments)"** box to enable form recipients to create multiple employment relationships. When enabled: * Workers can add more than one employer on the form * A link appears allowing them to add additional employments * Useful for workers with multiple jobs or who work at multiple locations When disabled (default): * Workers can only specify one employer * Simpler form experience In the **"Text for link that creates additional employments"** field, enter a custom label for the link that allows them to add additional employments. **Default**: "Add another" **Example alternatives**: * "Add another job" * "Add second workplace" ### Step 7: Save your work Once you've configured your employment options, click **Save** or move on to the next tab to continue customizing your form. ## Common Configuration Examples **Basic Manufacturing Shop Organizing** **Configuration**: * ☑ Create an employment * Custom label: "Where do you work?" * Selection method: Autocomplete (leaf node only) * ☐ Allow multiple employments: No **Result**: Simple, fast form where workers type their shop name and select from list. **Large Multi-Site Employer** **Configuration**: * ☑ Create an employment * Custom label: "Your location" * Selection method: Tiered drop-downs * ☐ Allow multiple employments: No **Result**: Workers select from structured list of divisions and facilities. **Industry with Many Casual Workers** **Configuration**: * ☑ Create an employment * Custom label: "Current employer" * Selection method: Autocomplete * ☑ Allow multiple employments: Yes * Additional employment label: "Add another job" **Result**: Workers can add multiple employers where they currently work. ### Integrated HR external system IDs **Configuration**: * ☑ Create an employment * Custom label: "Employer ID" * Selection method: External system * External system: "HR System" * ☐ Allow multiple employments: No **Result**: Workers enter their employer ID, and the system finds their employer automatically. ## Best Practices **Match your selection method to your data**: If you have a clean organization hierarchy in Broadstripes, use tiered dropdowns. If not, autocomplete works better. **Test with real workers**: What makes sense to you may confuse workers. Test the form with actual members of your audience. **Consider mobile users**: Autocomplete works better on mobile than deep tiered dropdowns. **Set up organizations first**: Employment matching only works if the employer organizations already exist in Broadstripes. Import or create them before launching your form. **Use clear labels**: "Where do you work?" is clearer than "Employing organization" for most audiences. ## Next Steps Here are links to the other documentation pages for public forms: * [Create a new public form](./create-public-form) * [The "Standard fields" tab](./standard-fields-tab-in-public-form) * [The "Timeline" tab](./timeline-tab) * [The "Content and attachments" tab](./form-content-tab) * [The "Confirmation email" tab](./email-tab) * [The "After submission" tab](./other-options-tab) * [Viewing and downloading public forms](./viewing-and-downloading-public-forms) # Content and attachments tab Source: https://help.broadstripes.com/docs/admin-guides/public-forms/form-content-tab Customize your public form with logos, styling, links, content elements, and file attachments # Overview Organizer Using Broadstripes Public Form On Phone On the **Content and attachments tab**, you can add additional content and fields to a public form including your organization's **logo**, **website links** and **custom style elements**. You can also allow submitters to upload file attachments. The Content and attachments tab controls the visual appearance and text content of your public form. This is where you customize what form submitters see when they open your form. ## Add a logo and other content Follow these steps to customize the visual and textual content of your public form: ### Step 1: Navigate to the Content and attachments tab To get started, select the **Content and attachments tab** in the public form editor. ### Step 2: Add a logo image Add a **logo image** by clicking the dashed **Add a logo** tile and uploading your organization's logo, or by dragging an image file onto the tile. This will appear at the top of your public form. Horizontal banners tend to look best. The image should have a maximum width of 640px and a maximum height of 100px. Form content tab showing the Add a logo upload tile **To upload a logo**: 1. Click the **Add a logo** tile (or drag an image file onto it) 2. Navigate to your logo file on your computer 3. Select the image file 4. Click **Save** at the bottom of the form editor **To remove a logo**: 1. Click **Remove** below the logo preview 2. Click **Save** at the bottom of the form editor **To replace a logo**: 1. Click **Replace** below the logo preview and select a new logo 2. The new logo will replace the old one when you save **Supported formats**: JPG, PNG, GIF **Recommended size**: Maximum width of 640px and maximum height of 100px **File size**: Keep the file small for the best experience on a mobile device When you duplicate a form, the system attempts to copy the logo. If logo copying fails, you'll see a warning message and will need to re-upload the logo to the duplicated form. ### Step 3: Add Header Text Below the logo, you can enter **Header Text**. This could be your organization's tagline or any title of your choosing. This is the main title that appears at the top of your form, below the logo (if you uploaded one). **Default**: If you leave this blank, the form NAME (from the top of the form editor) is used as the header. **Examples**: * "Worker Interest Card" * "Join Our Campaign" * "2025 Training Registration" * "Tell Us Your Story" * "Sign Up to Learn More" **Best practices**: * Keep it short (under 10 words) * Use action-oriented language * Make it welcoming and clear about the form's purpose * Consider your audience's language and perspective ### Step 4: Add Introduction text In the **Introduction** field, add a brief explanation or instructions for the form recipients. This is a good place to tell them what actions to take with the form. This text appears below the header and above the form fields. Use it to: * Explain the purpose of the form * Set expectations (how long it takes, what happens next) * Provide context or motivation * Include any necessary disclaimers **Example for a worker interest card**: ``` We're building a movement for better wages and working conditions. Fill out this form to join us and receive updates about our campaign. This form takes about 2 minutes to complete. ``` **Example for event registration**: ``` Join us for our monthly member meeting on March 15th at 6 PM. Fill out this form to RSVP and receive event details and reminders. ``` **Example for volunteer sign-up**: ``` Want to get involved? We need volunteers for phone banking, door knocking, and event support. Tell us what interests you and we'll be in touch with opportunities to get involved. ``` **Formatting**: * The introduction text supports line breaks * Keep paragraphs short for readability * Consider bullet points for multiple ideas * Don't make it too long--most people won't read more than 2-3 short paragraphs **Best practices**: * Answer "What is this for?" and "Why should I fill this out?" * Set realistic time expectations * Mention what happens after submission * Use welcoming, inclusive language * If required by law, include NLRB disclaimer: "Filling out this form does not obligate you to do anything or join anything." ## Customize your form with links and HTML styling The **Introduction** text, **Form submission button text**, and **Legal agreement** fields support hyperlinks and HTML tags, allowing you to format and style your text. For additional styling needs, please contact in-app support or [support@broadstripes.com](mailto:support@broadstripes.com) ### Step 5: Customize the submission button Customize your form's **submission button** with a call to action. Create your custom text for submitting in the **"Form submission button text"** field. This is the label on the button that submits the form. **Default**: "Submit" **Example alternatives**: * "Join Us" * "Sign Up" * "Register" * "Submit My Interest Card" * "Count Me In" * "I'm Interested" * "Save My Information" **Best practices**: * Use action language that reflects what the user is doing * Keep it short (1-3 words) * Match the tone of your campaign * Consider what commitment level you're asking for (avoid "JOIN THE UNION" if this is just an interest card) ### Step 6: Add a signature field (optional) Select the **"Show signature field"** checkbox to allow submitters to sign the form using their mouse or finger. When enabled: * A signature capture field appears near the bottom of the form (above the submit button) * Users can draw their signature with a mouse (desktop) or finger (mobile) * A "clear" link allows redoing the signature * Instructions appear: "Use your mouse (or your finger on a phone or tablet) to enter your signature above" * The signature is captured as an image and included in the PDF When disabled: * No signature field appears * Form submission is faster and simpler **When to enable**: * Union authorization cards (may be legally required) * Legal agreements or waivers * Forms where you need proof of identity * Official applications or nominations **When to disable**: * General interest forms * Event registrations * Casual sign-ups * Any form where signature isn't legally or procedurally necessary If you enable the signature field, most users will expect it to be required even if you don't mark it as required. Consider this when designing your form flow. ### Step 7: Add a Legal agreement (optional) You also have the option of including a section for a **Legal agreement** that a recipient must check before submitting the public form. Check the Legal agreement checkbox and enter the **text** of your agreement in the box below. This section has two parts: a checkbox to enable the legal agreement, and a text area for the agreement text. **To add a legal agreement**: 1. Check the box next to **Legal agreement** 2. Enter your agreement text in the **Legal agreement text** text area 3. The legal agreement will be added to your selected fields 4. Mark it as required in the "Selected fields" panel on the Standard fields tab **How it appears on the form**: * The legal agreement text displays near the bottom of the form (above signature if enabled) * A checkbox appears next to or below the text * The user must check the box to submit the form (if marked as required) **Legal agreement text** field: * Large text area for your agreement language * Supports line breaks * Supports HTML for formatting * Placeholder: "I agree that..." **Common legal agreement examples**: For union authorization cards: ``` I authorize [Union Name] to represent me in collective bargaining with my employer concerning wages, hours, and working conditions. I understand that this authorization is voluntary and that filling out this form does not obligate me to join the union or pay any fees or dues. ``` For general interest forms: ``` I understand that [Organization Name] will use the information I provide to contact me about campaign activities and events. I can opt out of communications at any time. ``` For NLRB compliance (elections): ``` I understand that signing this card does not obligate me to vote for the union in an NLRB election or to become a union member. I understand that federal law protects my right to sign or not sign this card. ``` **Best practices**: * Keep legal language as simple as possible * Break complex agreements into short paragraphs or bullet points * Consult with legal counsel for union authorization cards * Include required NLRB disclaimers if applicable * Don't use legal agreements for casual sign-up forms--they reduce completion rates **Positioning**: * Legal agreement text appears in the order you set in "Selected fields" on the Standard fields tab * It typically appears near the end of the form * Most campaigns place it just before the signature field (if enabled) or just before the submit button ### Step 8: Enable file attachments (optional) Check the **"Allow submitter to upload files up to 10 MB"** box to let users attach files to the form submission. Supported file types include: * Most image/video files * MS Office files * OpenOffice files * PDF * Plain text When enabled: * A file upload field appears on the public form * Users can select and upload files * Maximum file size: 10MB per file * Uploaded files attach to the contact record in Broadstripes When disabled: * No file upload option on the form **When to enable**: * Photo uploads for badges or profiles * Document submission for grievances or complaints * Supporting materials for applications or requests **When to skip**: * Simple interest cards or sign-ups * Forms where attachments aren't relevant * Concerns about inappropriate file uploads Files are scanned and stored securely. Project members can view and manage attachments in the contact record. When you enable attachments, the attachment field is automatically added to your form's selected fields. You control where it appears by dragging it in the "Selected fields" panel. #### Allow multiple attachments To permit multiple file uploads (with a total size limit of 10 MB), check the **"Allow multiple attachments"** box. This checkbox only appears if **Allow submitter to upload files** is enabled. When enabled: * Users can upload more than one file * An "Add another file" button appears after selecting a file * All uploaded files attach to the contact record When disabled: * Users can only upload one file * Simpler interface **When to enable**: * Resume + cover letter uploads * Multiple supporting documents * Photo galleries * Any scenario where one file isn't enough **When to skip**: * Most forms only need single file upload * Reduces complexity for users #### Custom label for attachment field You can also enter a descriptive label for the attachment field to inform form submitters about what kind of file(s) they should upload. This setting only appears if **Allow submitter to upload files** is enabled. **Default label**: "Attachments" **Custom label examples**: * "Upload your document" * "Profile photo" * "Supporting documents" * "Proof of employment" * "Badge photo" **Best practice**: Use clear, specific labels that tell users exactly what kind of file to upload. ### Step 9: Save your work Form Content TAB **Save** or move on to the next tab to continue customizing your public form. ## How Content Appears on the Form When someone opens your public form, they see (in order): 1. **Logo** (if uploaded) - centered at top 2. **Header text** - main title 3. **Introduction text** - explanatory paragraph(s) 4. **Required field notice** - "Fields marked with an asterisk (\*) are required" 5. **Form fields** - in the order you configured 6. **Legal agreement text** (if enabled this will appear in the order you set in "Selected fields" on the Standard fields tab) - with checkbox 7. **Signature field** (if enabled) - with canvas and "clear" link 8. **Submit button** - with your custom button text ## How Attachments Work When a form with attachments enabled is submitted: 1. **File upload**: User selects file(s) from their device 2. **Validation**: Broadstripes checks file size (must be under 10MB) 3. **Storage**: Files are uploaded to secure storage 4. **Attachment record**: An attachment record is created and linked to the contact 5. **Availability**: Files appear in the contact's Attachments section in Broadstripes **Viewing attachments**: * Go to the contact record in Broadstripes * Click the Attachments tab * All form-submitted files appear along with any other attachments for the contact **File formats supported**: Most common file formats (PDF, DOCX, JPG, PNG, etc.) **File size limit**: 10MB per file (enforced at upload time) ## Testing Your Form Content Before sharing your form widely: 1. Click **Save** to save your content changes 2. Copy the public form URL from the Public forms page 3. Open the URL in a private/incognito browser window 4. Review all the content: * Does the logo display correctly? * Is the header clear and welcoming? * Does the introduction provide enough context? * Is the legal agreement text clear and accurate? * Does the submit button text make sense? 5. Submit a test entry 6. Check the confirmation message (configured in the **After submission tab**) **View on mobile**: Many people will complete your form on a phone. Test on a mobile device or use your browser's mobile device emulation to ensure everything displays correctly. ## Accessibility Considerations **Clear headings**: The header text becomes the main heading for screen readers **Simple language**: Keep introduction text clear and concise for all literacy levels **Legal agreement readability**: Break complex legal text into short paragraphs **Signature field**: Includes clear instructions for all users ## Common Scenarios ### Basic Interest Card * Logo: Union logo * Header: "Worker Interest Card" * Introduction: "Want to learn more about organizing for better conditions? Fill out this card and an organizer will contact you." * Button: "Submit" * Signature: Disabled * Legal agreement: None ### Union Authorization Card * Logo: Union logo * Header: "Union Authorization Card" * Introduction: "By signing this card, you're authorizing \[Union] to represent you. Your signature does not obligate you to join the union or vote yes in an election." * Button: "Sign Card" * Signature: Enabled * Legal agreement: Full NLRB-compliant authorization language ### Event Registration * Logo: Campaign logo * Header: "March Member Meeting" * Introduction: "Join us March 15th at 6 PM for our monthly meeting. We'll discuss upcoming actions and vote on proposals. Dinner will be provided." * Button: "Register" * Signature: Disabled * Legal agreement: None ### Volunteer Sign-Up * Logo: Organization logo * Header: "Get Involved" * Introduction: "We need volunteers for phone banking, door knocking, and event support. Sign up and we'll match you with opportunities that fit your schedule and interests." * Button: "Sign Up" * Signature: Disabled * Legal agreement: None ## Next Steps Here are links to the other documentation pages for public forms: * [Create a new public form](./create-public-form) * [The "Standard fields" tab](./standard-fields-tab-in-public-form) * [The "Timeline" tab](./timeline-tab) * [The "Workplace" tab](./employment-tab) * [The "Confirmation email" tab](./email-tab) * [The "After submission" tab](./other-options-tab) * [Viewing and downloading public forms](./viewing-and-downloading-public-forms) # Organization tab Source: https://help.broadstripes.com/docs/admin-guides/public-forms/organization-tab Configure an organization picker on organization public forms so submitters can select an existing organization from your project # Overview The **Organization** tab allows you to add an organization picker field to your public form. When enabled, form submitters can search for and select an existing organization from your project rather than entering free text. The Organization tab only appears for **organization forms**. Person forms do not have this tab. ## Why add an organization picker? An organization picker is useful when you want form submitters to associate themselves or their submission with an organization that already exists in your project. For example: * An employer wanting to register their company * A shop representative identifying their workplace * A community member selecting their neighborhood association Without an org picker, submitters cannot link their submission to an existing organization record. The picker ensures form submissions are tied to the correct, pre-existing organization in Broadstripes rather than creating unmatched or duplicate records. ## Configure the organization picker Follow these steps to set up an organization picker on your public form: ### Step 1: Navigate to the Organization tab Open the public form editor and select the **Organization tab**. ### Step 2: Enable the organization picker Turn on the toggle in the **Organization selection** card at the top of the tab ("Let submitters pick an existing organization from the project") to add the org picker field to your form. The **Custom label** and selection-method options below stay grayed out until this toggle is on. Organization selection card with its toggle switched on in the Organization tab When enabled: * An organization search field appears on the public form * Submitters can search for and select an organization from your project * The selected organization is recorded with the form submission When unchecked, no organization picker is shown on the form. ### Step 3: Set a custom label (optional) Enter a descriptive label for the organization picker field using the **Custom label** field. **Default**: "Organization" **Custom label examples**: * "Your workplace" * "Select your employer" * "Which chapter are you with?" * "Your local" Use language your audience will recognize. If your submitters think of organizations as "shops" or "chapters," use those terms instead of the generic "Organization." ### Step 4: Choose the selection method Use the **"Choose the method by which the organization will be selected"** dropdown to control how submitters search for their organization. Three options are available: #### Tiered drop-downs Submitters choose from cascading dropdown menus, starting at the top of the organization hierarchy and drilling down to sub-organizations. **How it works**: * Multiple dropdown menus appear on the form * The first dropdown shows top-level organizations * Subsequent dropdowns show child organizations within the selected parent * The hierarchy depth matches your project's organization structure **Best for**: * Projects with a clear, well-known organizational hierarchy * Forms where you want to guide submitters step-by-step through the structure **Advantages**: * Structured data entry prevents typos and name variations * Works well when submitters know their place in the hierarchy **Disadvantages**: * Can be slow or confusing if the hierarchy is deep or unfamiliar to submitters #### Autocomplete Submitters type into a search field and select a matching organization from the suggestions. Matches against organization names at all levels of the hierarchy. **How it works**: * A text input with autocomplete appears on the form * As the submitter types, matching organization names appear in a dropdown * The submitter selects their organization from the list **Best for**: * Projects with many organizations * Submitters who know their organization's name but not its place in the hierarchy * Mobile-friendly forms **Example**: * Submitter types "union" * Autocomplete shows: "Union Local 42", "Tri-State Union", "Union Hall West" * Submitter selects the correct one **Advantages**: * Fast and intuitive * No need to understand the full organizational hierarchy #### Autocomplete, matching only against the lowest level of the org structure A variant of autocomplete that only suggests organizations at the lowest (leaf) level of the hierarchy. Parent and intermediate organizations are excluded from the results. **How it works**: * Same text-input autocomplete as above, but search results only include organizations with no children **Best for**: * Projects where submitters should always be linked to a specific location rather than a parent umbrella organization * Avoiding ambiguity when parent and child organizations have similar names **Example**: * Organization hierarchy: Regional Council > Local 42 > Shop Floor B * Regular autocomplete would show all three when the submitter types "42" * Leaf node autocomplete only shows "Shop Floor B" **Advantages**: * Prevents submitters from accidentally selecting a parent instead of their specific location * Produces cleaner, more precise data **Disadvantages**: * Requires a well-structured organization hierarchy in Broadstripes * May return no results if the hierarchy has not been set up correctly ### Step 5: Position the field on the form After saving the Organization tab settings, the organization picker field appears in the **Standard fields** tab as an item in the selected fields panel. You can drag it to reorder it relative to other fields on the form. ### Step 6: Save your work Click **Save** to apply your changes. The organization picker will now appear on the public form. ## How the field appears on the submitted form summary After a submitter completes the form, the confirmation summary page shows the selected organization. If you chose **Autocomplete** or **Tiered drop-downs**, the full hierarchical name is displayed. If you chose **Leaf node autocomplete**, only the organization's own name is shown. ## Next steps Here are links to the other documentation pages for public forms: * [Create a new public form](./create-public-form) * [The "Standard fields" tab](./standard-fields-tab-in-public-form) * [The "Timeline" tab](./timeline-tab) * [The "Workplace" tab](./employment-tab) *(person forms only)* * [The "Content and attachments" tab](./form-content-tab) * [The "Confirmation email" tab](./email-tab) * [The "After submission" tab](./other-options-tab) * [Viewing and downloading public forms](./viewing-and-downloading-public-forms) # After submission tab Source: https://help.broadstripes.com/docs/admin-guides/public-forms/other-options-tab Configure what happens after a form is submitted, including the confirmation message, event steps, contact type, and PDF settings # Overview The **After submission** tab configures what happens once a form is submitted: the message the submitter sees, plus the record-side outcomes -- the event step automatically applied, the contact type assigned to the created record, and the confirmation PDF saved to that record. Key features you can configure: * Set the success message shown to the submitter after a successful submission * Automatically apply event steps when forms are submitted * Set the contact type for new and matched contacts * Control PDF formatting (filename and show or hide blank fields) ## Configure after-submission options for your public form Follow these steps to set up after-submission options: ### Step 1: Navigate to the After submission tab To get started, select the **After submission tab** in the public form editor. ### Step 2: Set a successful submission message (optional) In the **"Successful submission message"** field, enter the message that will appear after the recipient submits the public form. This could be a simple thank you or additional instructions. This text displays on the confirmation page after someone successfully submits the form. **Example custom messages**: After interest card submission: ``` Thank you for your interest! An organizer will be in touch soon to answer your questions and discuss next steps. ``` After event registration: ``` You're registered! We'll send you event details and a reminder email 24 hours before the event. ``` After volunteer sign-up: ``` Thanks for signing up to volunteer! We'll email you with opportunities to get involved in the next few days. ``` **Best practices**: * Confirm that the submission was successful * Set expectations about next steps ("We'll contact you within X days") * Thank the submitter * Keep it brief -- 1-3 short sentences ### Step 3: Set an event step (optional) In the **"Automatically check event step"** drop-down menu, select an event step that will automatically be applied to the contact record upon form submission. This dropdown lists all active events and event steps configured in your campaign. You can choose from any event steps currently in your project. If you need to create a new event, refer to [this article](/docs/admin-guides/data-tools/creating-an-event) for instructions. **How it works**: When someone submits the form: 1. The contact record is created or updated 2. The selected event step is automatically applied to the contact 3. The contact's event status is updated accordingly **Example uses**: * Mark all form submitters as "Attended Training" if this is a training registration * Set status to "Interested" for interest card submissions * Apply "Contacted" status for cold contact forms * Mark as "Recruited" when someone signs up through an organizer's unique link **When to use**: * You want to track form submissions as a specific milestone * The form represents a specific stage in your organizing pipeline * You want submitters to appear in reports filtered by event step **When to skip**: * The form is general-purpose and doesn't represent a specific event * You'll manually set event steps after reviewing submissions * Event tracking isn't relevant to this form The dropdown only shows events marked as "active" in the Events page. If you don't see the event you need, go to **Events** in the left navigation and ensure the event is activated. ### Step 4: Select the contact type Next, select the contact type that will be created or matched when the form is submitted. The data submitted in the form will be created as this contact type. This dropdown controls which contact type is assigned to the contact after form submission. **Options**: 1. **Person** or **Organization** (default) - Contact type matches the form type 2. **Any internal contact type** - Choose from your project's configured contact types **How it works**: * By default, person forms create contacts with "Person" contact type * By default, organization forms create contacts with "Organization" contact type * But you can override this to use a specific contact type instead **Example uses**: * "Volunteer" form creates contacts with "Volunteer" contact type * "Member" form creates contacts with "Member" contact type * "Prospective Member" form creates contacts with "Prospective Member" contact type **Why change from default**: * Contact types help you categorize and filter contacts in Broadstripes * Reports and searches can filter by contact type * Different contact types may require different workflows Keep in mind that both new and merged records will be converted to this contact type. This is called "final contact type" because it's the type assigned AFTER the form processes. The system always creates the contact first, then changes the contact type to your selection. The dropdown only shows contact types configured for your project. If you need a new contact type, create it before configuring your form: click the **Project settings** icon in the upper right corner of any page (or press **Ctrl-K** / **⌘K**), then choose **Contact types**. ### Step 5: Configure the confirmation PDF A PDF of each submission is generated and saved to the contact record. You can customize its filename and contents. #### Hide blank fields on the PDF If you prefer not to show any fields that were left blank on the form, check the **"Hide blank fields on the PDF"** box. This will remove any empty fields from the final PDF. This controls how the generated PDF displays form data. When enabled: * Fields that were left empty by the submitter don't appear in the PDF * Cleaner, more compact PDF * Only shows data that was actually provided When disabled: * All form fields appear in the PDF, even if empty * Empty fields show as blank lines or "\[no data]" * Longer PDF that shows the complete form structure **Recommendation**: * Enable for most forms (cleaner PDFs) * Disable if you need to see the full form structure even for blank fields (audit purposes) #### Customize the PDF filename (optional) You can customize how generated PDF files are named by creating a filename pattern using tokens. Tokens are placeholders that get replaced with actual values when the PDF is generated. ##### Insert tokens using the dropdown Click the **Insert token** button to open a dropdown menu with available tokens: **System tokens** (always available): * **First name** - Submitter's first name * **Last name** - Submitter's last name * **Date (YYYY-MM-DD)** - Submission date (e.g., 2026-02-09) * **Time (HH-MM-SS-AM/PM-TZ)** - Submission time (e.g., 10-30-45-AM-EST) **Form field tokens** (based on your selected fields): * Any field you've added to your form in the Standard fields tab appears as a token option * Custom fields, person/organization fields, and employment fields are all available * Tokens are automatically generated from field labels (e.g., "Shift" becomes `%shift%`) To insert a token, position your cursor in the filename pattern editor where you want the token, then click **Insert token** and select the token from the dropdown. ##### How tokens appear in the editor Tokens display as **badges** in the editor, making them easy to identify and manage. For example, if you insert the First name and Last name tokens with an underscore between them, you'll see: `[First name]_[Last name]` Each badge shows the human-readable label for the token. You can type regular text between tokens to create separators like underscores, hyphens, or other characters. ##### Remove tokens To remove a token from your pattern: 1. Hover over the token badge 2. Click the **x** button that appears on the right side of the badge The token is removed and any surrounding text remains in place. ##### Orphaned tokens If you remove a form field from the Standard fields tab that's being used in your PDF filename pattern, the system will alert you. You have three options: 1. **Remove token and field** - Automatically removes both the token from the filename pattern and the field from the form 2. **Edit filename** - Navigate to the filename pattern editor to manually adjust the pattern 3. **Cancel** - Keep the field on the form If you save a form with orphaned tokens (tokens that reference fields no longer on the form), a confirmation dialog appears warning you that these tokens will appear as literal text in the filename. You can choose to **Go back** and fix the pattern, or **Save anyway** to proceed. ##### Example filename patterns | Pattern | Example output | | --------------------------------- | ------------------------------ | | `%first-name%_%last-name%` | `Jane_Doe.pdf` | | `%first-name%_%last-name%_%date%` | `Jane_Doe_2026-02-09.pdf` | | `%last-name%_%shift%_%date%` | `Doe_Morning_2026-02-09.pdf` | | `Intake_%first-name%_%last-name%` | `Intake_Jane_Doe.pdf` | | `%employer%_%last-name%_%date%` | `ACME-Corp_Doe_2026-02-09.pdf` | The `.pdf` extension is added automatically -- you don't need to include it in your pattern. Field values are sanitized (special characters replaced with hyphens) and truncated if too long to ensure valid filenames. ### Step 6: Save your work Once you've configured the options, click **Save** to finish customizing your public form. ## Configuration Examples ### Basic Worker Interest Card **Successful submission message**: "Thank you! An organizer will be in touch soon." **Event step**: "Interest Card : Submitted" **Final contact type**: "Prospective Member" **Hide blank fields on PDF**: Yes **Result**: Form submitters are marked with "Submitted" event status and "Prospective Member" contact type. PDFs are clean and concise. ### Volunteer Application **Successful submission message**: "Thanks for applying! We'll review your application and contact you within one week." **Event step**: "Volunteer Application : Applied" **Final contact type**: "Volunteer Applicant" **Hide blank fields on PDF**: Yes **Result**: Form submitters see a custom confirmation message and are assigned "Volunteer Applicant" contact type. ### Simple Event RSVP **Successful submission message**: "You're registered! We'll send you event details by email." **Event step**: "March Meeting : Registered" **Final contact type**: "Member" **Hide blank fields on PDF**: Yes **Result**: Clean, simple confirmation. Submitters are marked as registered for the March meeting. ### Grievance Form **Successful submission message**: "Your grievance has been filed. A representative will contact you within 48 hours." **Event step**: "Grievance : Filed" **Final contact type**: "Member" **Hide blank fields on PDF**: No (show complete form for records) **Result**: Grievants receive clear confirmation. Complete form is preserved in PDF for legal records. ## Best Practices **Confirmation messages**: Always set a message -- the default is generic. A specific, warm message builds trust. **Event steps**: Use specific event steps for each form to track your funnel **Contact types**: Use contact types to categorize your universe (prospective members vs. members vs. volunteers) **PDF formatting**: Enable "hide blank fields" for most forms to keep PDFs concise **Test thoroughly**: Submit test forms to ensure automations (event steps, contact types) work as expected **Document your approach**: Keep notes on which event steps and contact types you use for which forms ## Troubleshooting **Event step not applying**: * Verify the event is marked as "active" in the Events page * Check that you saved the form after selecting the event step * Submit a test form and check the contact record's Events section **Wrong contact type**: * Check that you selected the correct contact type in the dropdown * Remember: the contact is created first, then the contact type is applied * Verify the contact type exists and is configured for the right entity type (person/organization) **PDF formatting issues**: * Toggle "hide blank fields" to see if it improves layout * Review the PDF generation job logs if available * Submit test forms with different data to see what affects layout ## Next Steps Here are links to the other documentation pages for public forms: * [Create a new public form](./create-public-form) * [The "Standard fields" tab](./standard-fields-tab-in-public-form) * [The "Timeline" tab](./timeline-tab) * [The "Workplace" tab](./employment-tab) * [The "Content and attachments" tab](./form-content-tab) * [The "Confirmation email" tab](./email-tab) * [Viewing and downloading public forms](./viewing-and-downloading-public-forms) # Public forms overview Source: https://help.broadstripes.com/docs/admin-guides/public-forms/public-forms-overview Learn how public forms can help you collect data from non-Broadstripes users through customizable web forms ## What Are Public forms? Public forms allow you to create customizable web forms to collect important data like survey responses, contact info or card signatures from anyone with access to the Web – people who aren't Broadstripes users. Forms are fully customizable and can be shared with others by simply sending out a Web link. Anyone who clicks your link will be able to open the form, fill it out, and submit it online. All responses are stored in Broadstripes — your organizers can see them and even be notified by new forms being submitted on their turf! Public forms: * Collect information from workers, volunteers, or other contacts * Create new contact records in Broadstripes automatically * Can match submissions to existing contacts to avoid duplicates * Send confirmation emails to form submitters * Track submission history and generate PDFs * Support both worker (person) and organization forms ## Common Uses * **Digital membership cards**: Allows workers to legally agree to be represented by the union * **Worker sign-ups**: Collect contact information from workers interested in organizing * **Event registrations or check-ins**: Register attendees for meetings, actions, or trainings * **Volunteer applications**: Gather information from potential volunteers * **Employer relationships**: Create employment records linking workers to their employers * **Survey responses**: Collect structured information with custom fields * **Organizer debrief forms**: Gather information from volunteer organizers after organizing conversations ## Key Features **Flexible Field Selection** Choose from dozens of standard fields and custom fields specific to your project. Fields can be marked as required or optional, and you control the order they appear on the form. **Smart Duplicate Matching** When enabled, Broadstripes automatically attempts to match form submissions with existing contacts based on a unique identifier, or name and contact information. This prevents duplicate records and enriches existing contact information. **Split Address Fields** Choose between a single address text box or separate fields for street, city, state, and postal code. Split address fields can improve data quality and user experience. **Email Notifications** Send automatic confirmation emails to form submitters (as well as a BCC if desired), with optional PDF attachments of their submission. For employment forms, you can also notify employers when their workers register. **Employment Integration** For worker forms, collect employer information and automatically create employment relationships. Support multiple selection methods including autocomplete, tiered dropdowns, or external system IDs. **Timeline Tracking** Can be set to create timeline entries when forms are submitted, tracking the date, time, organizer, assessment, and notes about the interaction. **Event Tracking** Link form submissions to specific event steps in your campaign, automatically updating the contact's event status. **Custom Branding** Upload your logo, customize header and introduction text, add legal agreement text, and even include custom CSS for advanced styling. **Attachments** Allow form submitters to upload files. Files are stored in the attachments tab of the contact record. **Signature Field** Allow form submitters to sign the form. The signature is retained on the PDF generated from the form submission. ## Accessing Public forms 1. Click the **Project settings** icon in the upper right corner of any page (or press **Ctrl-K** / **⌘K**) 2. Choose **Public forms** Public forms index page The Public forms index page displays a table of all your public forms with: * Form name (click to edit) * actions dropdown menu (edit, duplicate, delete) * Type (Person or Organization) * Public link URL with go to and copy buttons * Enabled/disabled checkbox * Amber warning icon next to the form name when a BCC recipient address is undeliverable (open the form and go to the Confirmation email tab to resolve) * Submissions count * Created by ## Managing Existing Forms From the Public forms index page, you can: * **Edit**: Click the form name or use the actions menu (or ellipsis icon in the Name column) * **Duplicate**: Create a copy using the actions menu (Click the ellipsis icon in the Name column) * **Delete**: Remove unused forms via the actions menu (Click the ellipsis icon in the Name column) * **Copy URL**: Click the copy icon next to the form link * **Go to form**: Click the go to icon next to the form link * **Enable/Disable**: Toggle the checkbox in the Enabled column ## What Happens When Someone Submits a Form? 1. **Validation**: Broadstripes checks that all required fields are filled 2. **Confirmation page**: Shows a success message to the submitter 3. **Duplicate matching**: If enabled, searches for existing contacts 4. **Record creation or update**: Creates a new contact, or updates the matched contact in place. Matched records keep their existing Broadstripes ID, timeline history, and references; addresses, phone numbers, emails, and custom field values are deduplicated against the existing record so submissions add information without overwriting it. 5. **Employment**: Creates employment relationships if configured 6. **Timeline**: Adds timeline entry if configured 7. **Events**: Updates event steps if configured 8. **PDF generation**: Creates and stores a PDF of the submission 9. **Emails**: Sends confirmation emails if configured ## Next Steps - Create Since public forms can collect a wide range of information, the interface for creating them has several parts. Therefore, we've split the documentation into multiple articles. Together, these articles will guide you through customizing a basic form, collecting different types of data, and viewing the responses you receive. Here's a roadmap to working with public forms: * [First step: create a new public form](./create-public-form) * [The "Standard fields" tab](./standard-fields-tab-in-public-form/) * [The "Timeline" tab](./timeline-tab/) * [The "Workplace" tab](./employment-tab/) * [The "Content and attachments" tab](./form-content-tab/) * [The "Confirmation email" tab](./email-tab/) * [The "After submission" tab](./other-options-tab/) * [Viewing and downloading public forms](./viewing-and-downloading-public-forms/) To get the full picture of what public forms have to offer, new users should plan to take a look at each article. # Standard fields tab Source: https://help.broadstripes.com/docs/admin-guides/public-forms/standard-fields-tab-in-public-form Learn how to configure basic data fields for your public forms using the Standard fields tab ## Choosing the basic data fields for your form It's possible to capture many different types of Broadstripes data using public forms. The **Standard fields** tab of the public form editor allows you to indicate which of your project's most common data items you want on your form. By default, the **Standard fields** tab is open and visible when you first create a public form and each time you open it for editing after that. Let's look at what it offers. ## Understanding the Standard Fields Interface The Standard fields tab has two panels: **Left Panel - Available Fields**: Shows all fields you can add to your form, organized by category **Right Panel - Selected Fields**: Shows fields you've added, in the order they'll appear on the form ## Step 1: Match existing records? Record matching is controlled by the **Attempt to match existing contacts** toggle. It is not on the Standard fields tab itself: it sits in the upper panel above the tabs, between the public-access card and the **Form status** strip, so it applies no matter which tab you're on. When enabled (recommended for most forms): * Broadstripes searches for existing contacts with matching email and/or phone * If found, updates the existing contact in place instead of creating a duplicate * If not found, creates a new contact * The name fields and at least one of the two contact info types must match for a record match to be found * Name-matching is done using "fuzzy logic;" for example, "Thomas" will match "Tom" and "Tommy" **How matched records are updated** When Broadstripes finds a match, the matched contact is updated directly. The contact's existing Broadstripes ID, timeline history, and any references from other parts of the app (search results, reports, leadership relationships, etc.) are preserved. * **Addresses, phone numbers, and emails** in the submission are deduplicated against the existing record. New values are added; values that already exist are not duplicated. * **Custom field values** that already exist on the record are deduplicated against the submission. Multi-value fields gain new values from the submission; existing values are preserved. * **Single-value fields** (for example, an assessment, a date custom field, or general notes) are handled according to the **Keep existing values when a field is left blank** setting (see below). With the default setting on, a blank field keeps the existing value; when the form submits a new value, that value is written in. When disabled: * Always creates a new contact * May result in duplicates if someone submits multiple times * Useful for event registrations where you want each submission tracked separately ## Blank submissions The **Standard fields** tab opens with the **Form fields** heading, followed by a **Blank submissions** section. It contains a single checkbox and an info icon that explain how empty fields affect an existing contact's data. ### Keep existing values when a field is left blank This setting controls what happens when a form submission matches an existing contact and the submitter leaves a field empty. The checkbox is **checked by default**. Click the icon next to the checkbox to open a popover that lists exactly which fields this setting governs and which are always preserved regardless of the setting. Blank submissions section of the Standard fields tab with Keep existing values checkbox | State | What a blank field does to the matched contact | | ----------------- | ---------------------------------------------------------- | | Checked (default) | Keeps the existing value on the contact's record unchanged | | Unchecked | Overwrites or removes the existing value | **Fields this setting controls:** * Standard text fields -- nickname, notes, and other single-line fields * Custom fields -- text boxes, dropdowns, and multi-selects * Checkboxes -- an unchecked box will not clear an existing "Yes" * Event steps -- leaving a step unchecked will not remove it from the contact * Radio buttons -- fields that appear as a radio button group will not overwrite the existing value when no option is chosen; this applies to single-choice events and to dropdown fields with fewer than 4 options, which render as radio buttons on public forms **Fields that are always kept regardless of this setting:** * Multi-line (paragraph) custom fields -- new text is appended, never replaced * Phone numbers, emails, and mailing addresses This setting only affects matched contacts. For new contacts (no match found), blank fields result in no value being stored for that field. ## Step 2: Choose the basic data fields Next, you can **select any fields** you want to appear on the public form by checking the box next to the field name in the left panel. The fields are organized into categories: ### Basic Fields Category These fields capture fundamental information about the contact. #### For Person Forms **First name** * Worker's first (given) name * Text input field * Usually marked as required **Last name** * Worker's last (family) name * Text input field * Usually marked as required **Middle name** * Worker's middle name or initial * Text input field **Nickname** * Preferred name or alias * Text input field **Suffix** * Name suffix like Jr., Sr., III * Text input field **General notes** * Free-form notes about the person * Large text area #### For Organization Forms **Name** * Organization's full name * Text input field * Usually marked as required **Nickname** * Abbreviated or informal name * Text input field **General notes** * Free-form notes about the organization * Large text area ### Contact Info Category These fields collect contact information like phone numbers, email addresses, and physical addresses. #### For Person Forms **Cell phone** * Mobile/cellular phone number * Telephone input field * Includes "Preferred phone" checkbox **Cell phone opt in** * Permission to send text messages * Checkbox (checked by default) * Text: "Opt in to receiving texts to this phone number" **Personal email** * Primary email address * Email input field (validates email format) * Most commonly used email field **Personal email opt in** * Permission to send emails * Checkbox (checked by default) * Text: "Opt in to receiving email to this email address" **Home address** * Residential mailing address * Can display as single textarea OR split fields (see Contact Info Options below) **Home phone** * Landline/home telephone number * Telephone input field * Includes "Preferred phone" checkbox **Business email** * Work email address * Email input field * Includes confirmation option if enabled **Business email opt in** * Permission to send emails to work address * Checkbox (checked by default) #### For Organization Forms **Business address** * Organization's physical address * Can display as single textarea OR split fields (see Contact Info Options below) **Business cell phone** * Organization's mobile phone * Telephone input field * Includes "Preferred phone" checkbox **Business cell phone opt in** * Permission to send texts * Checkbox (checked by default) **Business email** * Organization's email address * Email input field **Business email opt in** * Permission to send emails * Checkbox (checked by default) **Business phone** * Organization's main phone line * Telephone input field * Includes "Preferred phone" checkbox ### Events Category If your campaign has active events configured, they appear in this category. Each event becomes a field on the form. **Single-choice events**: * Display as radio buttons (user can select only one option) * Example: "Which shift would you like?" with options for morning/afternoon/evening **Multi-choice events**: * Display as checkboxes (user can select multiple options) * Example: "Which trainings are you interested in?" with multiple training options To add an event to your form: 1. Check the box next to the event name 2. The event and all its steps will appear on the public form 3. When submitted, the contact's event status is updated automatically ### Custom Fields Category Custom fields you've created for your campaign appear here. Only certain custom field types can be used in public forms: **Supported custom field types**: * **Text field**: Single-line text input (can be configured as Text, Number, or Date) * **Text area**: Multi-line text input * **Checkbox**: Yes/no checkbox * **Select (dropdown)**: Choose one option from a list * **Multiselect**: Choose multiple options from a list * **Sortable list**: Drag-and-drop ranking of options Custom fields display with their name or their "Long display name" (if configured) and behave according to their type. The "Time of day" custom field type is NOT available for public forms and won't appear in this list. Custom fields marked "Editable by admins only" are also excluded from public forms. ### Unique IDs Category External system identifiers configured for your campaign appear here. **For Organization Forms**: * **Broadstripes ID**: The unique identifier generated by Broadstripes * Plus any external system IDs you've configured **For Person Forms**: * External system IDs only These fields allow submitters to provide identifiers from other systems you use (payroll IDs, member numbers, etc.). ### Employment Settings Category These fields are NOT directly visible in this section. They're configured in the **Workplace tab** (person forms only) but appear here for reference. See the [Workplace tab](./employment-tab) guide for details. ### Timeline Settings Category These fields are NOT directly visible in this section. They're configured in the **Timeline tab** but appear here for reference. See the [Timeline Tab](./timeline-tab.md) guide for details. ## Step 3: Configure Contact Info Options Below the Contact Info fields, you'll see **Contact info options** with three important checkboxes: ### Confirm email addresses When any type of **email** is selected, you have the option of having recipients enter their email twice for accuracy by checking the **"Confirm email addresses"** checkbox. When enabled: * A second input box appears below each email field * The submitter must enter the email address twice * Form validation checks that both entries match * Reduces email typos but may frustrate users When disabled: * Single email input field * Faster for users but higher risk of typos **Recommendation**: Enable for critical campaigns where email accuracy is essential (NLRB elections, card signing, certification votes). Disable for general sign-ups where you can follow up if email bounces. ### Split the address into separate fields When enabled: * Address displays as four separate fields: * Street address and unit * City * State * Postal code * All four fields are required if the address field is marked required When disabled: * Address displays as a single large text box * User types the complete address in free-form **Recommendation**: Enable split fields for most forms. This improves data quality and makes it easier for users on mobile devices. Disable only if your users need to enter addresses in non-standard formats. ### Make the submitted address the new primary This option controls what happens when matching is enabled and the form submission matches an existing contact who already has a primary address. When enabled (default): * The address submitted with the form becomes the new primary address * The existing primary address remains but is demoted to non-primary * Useful when you want the most recent address to be primary When disabled: * The existing primary address stays primary * The submitted address is added as a non-primary address * Useful when the form address is temporary (like a campaign office) or less reliable than the existing data This only affects MATCHED contacts. For new contacts, the submitted address always becomes primary regardless of this setting. ## Step 4: Set the order of the fields Whenever a field is checked, it will show up at the bottom of the **Selected fields** panel on the right side of the page. Once fields are in the **Selected fields** panel, you can drag and drop them to **reorder** their appearance on the form. To reorder fields: 1. In the "Selected fields" panel (right side), click and hold a field's drag handle () 2. Drop it in the desired position 3. Fields appear on the public form in this exact order, top to bottom Selected fields panel with drag handles, Required? checkboxes, and Used for matching? indicators The panel's **Used for matching?** column shows a checkmark next to fields that record matching uses to find existing contacts (see Step 1 above). ## Step 5: Require specific fields Check the **"Required?"** checkbox to indicate which fields will be required to complete a submission. If a user leaves a required field blank, they will receive a warning and will be prevented from submitting the form until the required field is completed. To make a field required: 1. Find the field in the "Selected fields" panel (right side) 2. Check the **Required?** checkbox next to the field 3. Required fields must be filled out before the form can be submitted 4. Required fields display with an asterisk (\*) on the public form Organizers often find that required fields prevent workers who don't know or don't want to share certain information from submitting forms. We often hear that, in the end, it's not worth it to require fields because you lose data you might otherwise receive. It's your choice — consider carefully. ## Step 6: Save your work When you've selected all of the fields you want, click **Save.** This will close the form editor. To continue customizing your public form, return to the **Public forms** page, click the **actions menu** (⋯) next to your form's name, and select **Edit**. **NOTE:** Instead of clicking **Save**, you can simply move on to other tabs to make additional changes to the form. Clicking **Save** will preserve the changes from all tabs at once. Be careful to do so at least once before you stop editing the form or allow your Broadstripes session to time out. ## Best Practices for Field Selection **Keep forms short**: Only ask for information you truly need. Long forms reduce completion rates. **Mark truly required fields**: Every required field increases abandonment risk. Only mark fields as required if you absolutely need the information. **Use logical order**: Group related fields together (name fields together, contact info together, etc.). **Test your form**: Fill it out yourself on both desktop and mobile before sharing widely. ## Next Steps The following articles discuss the functional details of each tab on the public form editor: **Configure what information to collect:** * [The "Timeline" tab](./timeline-tab/) - Create timeline entries for organizing interactions * [The "Workplace" tab](./employment-tab/) - Collect employer/workplace information **Customize appearance and communications:** * [The "Content and attachments" tab](./form-content-tab/) - Add logo, header text, introduction, legal agreement, signature field, and file attachments * [The "Confirmation email" tab](./email-tab/) - Set up confirmation emails with optional PDF attachments **Configure after-submission options:** * [The "After submission" tab](./other-options-tab/) - Set the confirmation message, event steps, contact types, and PDF settings **Manage and share your form:** * [Viewing and downloading public forms](./viewing-and-downloading-public-forms/) - Access the public URL, test the form, and track submissions # Timeline tab Source: https://help.broadstripes.com/docs/admin-guides/public-forms/timeline-tab Configure your public form to create timeline items for organizing events and interactions # Timeline Tab The Timeline tab allows you to automatically create a timeline entry when someone submits your public form. This creates a record of the interaction in the contact's timeline history. Timeline Tab ## What is a Timeline Entry? Timeline entries (also called timeline items) record interactions with contacts. They include: * Date and time of occurrence * Type of interaction (phone call, door knock, text, etc.) * Who made the contact (organizer name) * Assessment (coded value indicating level of support) * Notes about the interaction ## Overview At the top of the Timeline tab, you'll see the **Timeline entry** card ("Create a timeline entry for the person this form creates or matches"). Timeline entry card with its toggle at the top of the Timeline tab Turn on the card's toggle to enable timeline creation. The rest of the tab's options stay grayed out until this toggle is on. When enabled: * A timeline entry is created each time the form is submitted * The entry is linked to the new or matched contact * The entry appears in the contact's timeline history in Broadstripes When unchecked, no timeline entry is created (though the form submission itself is still tracked). **When to enable timeline creation:** * If the form represents a real organizing contact (door knock transcription, event sign-up, interest card) * When you want to track form submissions as organizing interactions * For debrief forms that organizers fill out after conversations **When to skip timeline creation:** * If the form is just updating contact information without an organizing interaction * For simple data collection forms where the interaction isn't meaningful ## Timeline Type **What type of timeline entry?** dropdown Select the journal entry type that best represents this interaction. Common options include: * Phone call * House Visit * One-on-one * Group meeting The list shows all timeline types configured for your campaign. Your administrator can create custom timeline types specific to your organizing work. Create a specific timeline type called "Online Form Submission" or "Public Form - \[Form Name]" to easily identify and report on these interactions later. ## Timeline Fields Below the timeline type, you'll see a table with two columns: * **Timeline field**: The fields you can add to your form * **Custom label on form**: The label that will appear to form submitters Each field has: * A checkbox to include it on the form * A text input for customizing the label ### Date of Occurrence **Default label**: "Occurred on" The date when the interaction happened. Displays as a calendar date picker with a "today" button. **When to include**: * Event registrations (to capture event date) * Incident reports (to capture when something happened) * Sign-ups for future actions (to record the action date) **Custom label examples**: * "Event date" * "Date of incident" * "Action date" * "Training date" ### Time of Day **Default label**: "Occurred at" The specific time when the interaction happened. Displays as a time picker with a "now" button. **When to include**: * Event registrations with specific start times * Shift sign-ups * Meeting registrations **When to skip**: * Most general sign-up forms (exact time is not relevant) **Custom label examples**: * "Event start time" * "Shift time" ### Contacted By **Default label**: "Contacted by" A phone number or email address field that identifies who made the contact. Broadstripes will try to match this contact information (cell phone number or email) to an existing person in the app to find the organizer's name. You should relabel this field with a meaningful custom label, like **"Organizer Phone"** or **"Organizer Email"** to make it clear that the form submitter should enter the organizer's phone number or email address, NOT their name. **When to include**: * Forms distributed by specific organizers (so they get credit for the contact) * Events where you need to track which organizer recruited someone * Paper forms transcribed by organizers **When to skip**: * Self-service online forms where no specific organizer is involved * Anonymous forms **Custom label examples**: * "Organizer Phone" * "Phone of Contacting Person" * "Organizer Email" * "Your Phone or Email" ### Assessment (Code) **Default label**: Your campaign's code/assessment label (e.g., "Code", "Assessment", "Level") The coded assessment value indicating the level of support or engagement. Displays as radio buttons with your campaign's configured codes (typically 0-5 or 1-5). **When to include**: * Initial contact forms where organizers assess support level * Follow-up forms to track changes in support * Forms where you want the submitter to self-assess their level of interest **When to skip**: * Forms where assessment is not relevant * Self-service forms where users can't meaningfully self-assess **Custom label examples**: * "Interest level" * "Support level" * "How likely are you to vote yes?" * "Commitment level" The assessment scale in forms never goes to 100. Most campaigns use a 0-5 scale, sometimes extending to 7. The options displayed are based on your campaign's configured assessment codes. ### Description/Notes **Default label**: "Description/Notes" Free-form text area for additional notes about the interaction. **When to include**: * Almost all forms benefit from a notes field * Allows capturing context and details * Gives submitters a place to add information not captured by other fields **When to skip**: * Very simple forms with a single purpose * Forms where you want to minimize length **Custom label examples**: * "Additional comments" * "Questions or concerns" * "Tell us more" * "What issues are most important to you?" * "How can we help?" ## Timeline Field Configuration Example Here's a typical configuration for a worker interest card: | Timeline field | Include? | Custom label on form | | ------------------ | -------- | ------------------------------------------- | | Date of occurrence | ☐ No | (not needed - submission date is enough) | | Time of day | ☐ No | (not needed) | | Contacted by | ☑ Yes | "Email of organizer who gave you this form" | | Assessment | ☑ Yes | "How interested are you in learning more?" | | Description/Notes | ☑ Yes | "Questions or concerns" | ## What the Timeline Entry Contains When a form is submitted with timeline creation enabled, Broadstripes creates a timeline entry containing: **Always included**: * Submission timestamp (when the form was submitted) * Timeline type (as selected in the dropdown) * A note indicating it came from the public form **Conditionally included** (based on which fields you enabled): * Custom date of occurrence (if field was enabled and filled) * Custom time of day (if field was enabled and filled) * Contacted by value (if field was enabled and filled) * Assessment/code value (if field was enabled and filled) * Description/notes text (if field was enabled and filled) ## Timeline Entry Visibility Timeline entries created by public forms: * Appear in the contact's Timeline section in Broadstripes * Are visible to all users with access to the contact ## Best Practices **Use timeline creation for organizing interactions**: If the form represents a real organizing contact (door knock transcription, event sign-up, interest card), create a timeline entry. **Skip timeline creation for data updates**: If the form is just updating contact information without an organizing interaction, you may not need a timeline entry. **Use meaningful timeline types**: Create specific timeline types for your forms rather than reusing generic types. This makes reporting easier. **Customize labels for your audience**: Use language your form submitters will understand. "What got you interested?" is clearer than "Contacted by reason" for most audiences. **Test the timeline**: Submit a test form and check the contact's timeline in Broadstripes to ensure it looks correct. ## Common Scenarios ### Worker Interest Card * ☑ Create timeline entry * Timeline type: "Worker Interest Card" * Include: Contacted by, Assessment, Notes ### Event Registration * ☑ Create timeline entry * Timeline type: "Event Registration" * Include: Date of occurrence (event date), Notes * Skip: Time, Contacted by, Assessment (not relevant for event RSVPs) ### General Contact Form * ☐ Skip timeline entry * (Or create minimal entry with just notes field) ### Shop Steward Nomination Form * ☑ Create timeline entry * Timeline type: "Shop Steward Nomination" * Include: Notes (for nomination details) * Skip: Date, Time, Contacted by, Assessment ## Next Steps You can **save** or move on to the next tab to finish customizing your public form. * [The "Workplace" tab](./employment-tab) - Configure employment relationships (person forms only) * [The "Content and attachments" tab](./form-content-tab) - Customize the form's appearance and enable file uploads * [The "Confirmation email" tab](./email-tab) - Set up email notifications * [The "Standard fields" tab](./standard-fields-tab-in-public-form) - Return to field selection # Viewing and downloading public forms Source: https://help.broadstripes.com/docs/admin-guides/public-forms/viewing-and-downloading-public-forms Learn how to view, search for, and download submitted public forms from your Broadstripes project # Overview Once public forms have been submitted, you may view or download them for printing or other purposes. This guide shows you how to access submitted forms, search for specific submissions, and download PDFs of completed forms—either individually or in bulk. ## Viewing public forms Follow these steps to view submitted public forms: ### Step 1: Navigate to Submitted public forms Click the **Project settings** icon in the upper right corner of any page (or press **Ctrl-K** / **⌘K**), then type "Submitted" in the **Search settings** box to filter the list. ### Step 2: Open the Submitted public forms page Choose **Submitted public forms** from the filtered list. ### Step 3: Review the submitted forms list This will take you to a list of all the contacts that were matched or created by a submitted form in your project. The **Forms submitted** page provides key information about each submission, including: * Submission contact type (Name of the public form) * Date and time of submission * IP address of the submitter * Web browser used * Matching results for existing records ### Step 4: Download individual form PDFs Next to each contact, you'll see an icon you can click to download a copy of that contact's form. **What's in the PDF**: * All form fields and submitted values * Form branding (logo, header) * Signature image (if captured) * Timestamp of submission * Contact information ### Step 5: Delete form submissions (if needed) At the end of each contact row, you'll find the option to **Delete** the form submission. **Important**: Deleting a form submission will permanently remove both the form and the associated contact record from your Broadstripes project. This action cannot be undone, and the record cannot be retrieved after deletion. ## Searching for public forms If you are looking for a specific public form, you can **search for attachments** with that form's name. The search will return all records that have a downloadable attachment with that name. 1. Go to the main Search page 2. Use the search bar to search for attachments with the form name 3. Review the results to find specific form submissions **Alternative**: Search by contact type if you set a specific contact type for your form: * type = "\[Your Form's Contact Type name]" e.g. `type = "Contract Worker"` * This returns all contacts created by that specific form ## Downloading public forms You may **download** the PDF(s) created by a public form submission one at a time or in bulk. Here's how: ### Download multiple forms in bulk From the **search results** page, select one or more contacts with attached forms. If you are new to working with search results, this [Selecting (and deselecting) contacts](/docs/viewing-search-results-and-edit/selecting-deselecting-contacts) article can show you how. **Step 1: Select contacts in search results** Use the checkboxes in the search results to select the contacts whose forms you want to download. **Step 2: Generate attachments report** Next, go the **Reports** dropdown menu and select **Attachments**. **Step 3: Download the zip file** Broadstripes will generate a **zip file** containing the requested forms. This report will download all the attachments for each contact, not just the public form PDFs. If a contact has other attachments, those will be included in the zip file as well. ### Download a single form To view a single form, you may simply go to the person's record and download it from the **Attachments** tab. **Step 1: Open the contact record** Search for and open the contact record in Broadstripes. **Step 2: Navigate to Attachments tab** Click on the **Attachments** tab in the contact record. **Step 3: Download the form PDF** Click on the file with the name of the public form to download. **What's in the PDF**: * All form fields and submitted values * Form branding (logo, header) * Signature image (if captured) * Timestamp of submission * Contact information By following these steps, you can efficiently manage, view, and download your submitted public forms. ## Next Steps Here are links to the other documentation pages for public forms: * [Create a new public form](./create-public-form) * [The "Standard fields" tab](./standard-fields-tab-in-public-form) * [The "Timeline" tab](./timeline-tab) * [The "Workplace" tab](./employment-tab) * [The "Content and attachments" tab](./form-content-tab) * [The "Confirmation email" tab](./email-tab) * [The "After submission" tab](./other-options-tab) # Create a project from the union portal Source: https://help.broadstripes.com/docs/admin-guides/union-portal/create-a-project Union admins can create new projects for their project group directly from the union portal dashboard. Union admins can create a new project for their group without leaving the union portal. The new project is set up with your group's core organizing features enabled, and you choose its name, geocoder, and optional features as you create it. ## Open the New project dialog On the **Projects** tab of the union portal dashboard, click the **New project...** button. It appears both above and below the projects table. Union portal Projects tab with the New project button above the projects table ## Fill in the project details The **New project** dialog collects everything Broadstripes needs to set up the project. New project dialog with Name field, Primary geocoder dropdown, and Project Settings checkboxes * **Name** -- the project's display name, up to 40 characters. A character counter appears as you approach the limit. The name must be different from every existing project's name; Broadstripes tells you if it conflicts. * **Primary geocoder** -- which address geocoder the project uses: **US** (the default), **Canada**, or **None**. * **Project Settings** -- optional features for the project, all off by default: * **Data imports can create multiple employments** * **Require two-factor authentication** * **SMS messaging** * **Email** * **Call Center (phone-banking)** * **Limited visibility** * **Public forms** Core organizing features -- labor organizing, employments, community organizing, and telecom opt-in/opt-out tracking -- are always enabled on new projects, so you only choose the optional ones here. Click **Save** to create the project, or **Cancel** to close the dialog without creating anything. ## After the project is created When the project is created, a confirmation toast appears, the dialog closes, and the new project shows up as a row in the projects table with its **Active** status. The **Your projects** count at the top of the dashboard updates to include it. You stay on the union portal dashboard -- to open the new project, click the **actions menu** (⋯) next to its name and select **Go to project**, which opens it in a new browser tab. Broadstripes generates the project's URL nickname automatically from your group name and the project name -- you don't need to choose one. ## Next steps Once the project exists, see [Manage project members](/docs/admin-guides/union-portal/manage-project-members) to add organizers to it and set their roles and permissions. # Manage project members from the union portal Source: https://help.broadstripes.com/docs/admin-guides/union-portal/manage-project-members Add members to a project, set their roles and permissions, and deactivate or reactivate memberships from the union portal. Union admins control who belongs to each project in their group from the union portal. You can add existing group members or brand-new people to a project, choose their role and permissions as you add them, and deactivate or reactivate memberships at any time. ## The project actions menu Each row in the projects table has an **actions menu** (⋯) next to the project name. It contains the member-management entry points: Project actions menu with Edit settings, Manage members, Add members, and Go to project * **Edit settings** -- opens the project's general settings dialog. * **Manage members** -- opens a panel listing the project's current members, where you can deactivate or reactivate memberships. * **Add members** -- opens the Add members page for the project. * **Go to project** -- opens the project itself in a new browser tab. ## Add members to a project Select **Add members** from a project's actions menu to open its Add members page. Add members page with the member search box and selected members area Use the search box to find people. Results only show people who belong to at least one other project in your group and are not already members of this project. Each result shows the person's name, email, and how many of your group's projects they belong to. ### Set the role and permissions Selecting a person opens the **Assign project membership role** dialog. Your selections apply only to this person's membership in this project. Assign project membership role dialog with Role dropdown and permission checkboxes * **Role** (required) -- **Admin** or **Basic user**. * **Create a linked person for this user account** -- checked by default; creates a person record for the user so they can organize. Not available on read-only projects. * **Permissions** -- once you pick a role, checkboxes appear for communications permissions (sending SMS, setting opt-in/opt-out, managing call center pools, sending bulk emails) and miscellaneous permissions (downloading files, merging contacts, and more). The available options vary by role -- for example, only admins can be given **Can manage members**, and only basic users need **Can manage public forms** or **Can perform data imports** granted explicitly. Click **Save and add** to stage the person, or **Cancel** to close without adding them. ### Add someone who is new to Broadstripes To invite a person who doesn't have a user account yet, type their name or email address in the search box and select **Create a new member named "..."**. A short setup wizard walks you through three steps: 1. **Create user account** -- first name, last name, and email address, plus an optional note for the invitation email. 2. **Assign membership role** -- the same role and permission choices described above. 3. **Finish** -- a review of what happens next. The new person is staged in your selection list; their account isn't created until you save the whole list. ### Save your selections Staged people appear as removable chips with their role badge, and an amber reminder reads **Pending. Click 'Add members' to save.** Nothing is saved until you click the **Add members** button, which shows a count of how many people you're adding. When you save, Broadstripes adds the members, emails an activation link to anyone you invited as a new user, and returns you to the union portal dashboard with a confirmation toast. If you leave the Add members page with people still staged, your selections are discarded. Broadstripes warns you before you leave. ## Deactivate or reactivate a membership Removing someone from a project is done by **deactivating** their membership -- memberships are never deleted, so you can always reactivate them later. Select **Manage members** from a project's actions menu to open the project members panel. It lists each member's name, email, last active date, membership status, and role. Project members panel with membership status toggles for each member The **Membership status** column holds a toggle for each member. Switch it off to deactivate the membership, or on to reactivate it. The change takes effect immediately -- there is no confirmation step -- and a toast confirms the update. ## View one person's memberships across projects From the **Users** tab of the dashboard, hover over a person's **Membership status** cell and click the **View user memberships** icon (). You can also select a person from the union portal header search. User memberships modal listing projects with status toggles and a Deactivate all memberships button The dialog lists every project membership the person has in your group, with their role, status, last active date, and who invited them. From here you can: * Toggle any single membership's **Status** to deactivate or reactivate it, just like in the project members panel. * Click **Deactivate all memberships** to deactivate the person's memberships in every project at once -- useful when someone leaves your organization. This dialog is for reviewing and deactivating only. To add the person to another project, use that project's **Add members** page. # Search the union portal Source: https://help.broadstripes.com/docs/admin-guides/union-portal/search-the-union-portal Use the union portal header search to find projects and users, open settings, and filter the Projects and Users tables by name. Union admins have a combined search bar at the top of the union portal header that searches both projects and users at the same time. Type a name to find a project or a person, select a result to open its settings or memberships directly, or use the "view matching" rows to switch tabs and pre-filter the table. ## Open the search Click the search bar in the union portal header, or press **Cmd+K** on a Mac or **Ctrl+K** on Windows and Linux to focus it from the keyboard. Union portal header search bar Typing begins after two characters. A brief pause after each keystroke keeps requests from stacking up as you type. ## Search results Results appear in a dropdown below the search bar. The dropdown shows up to 20 projects and up to 20 users. Projects appear first, followed by users. Each type of result row shows different information: * **Project rows** -- a colored square badge showing the project's initials, the project name, and the project's current status (for example, Active or Organizing). * **User rows** -- the user's avatar, their full name, email address, and either the number of projects in the portal they belong to, or a **Union admin** badge if they are a project group admin. At the top of the dropdown, two pinned action rows may appear: * **"view N users matching ..."** -- available when at least one user matches. * **"view N projects matching ..."** -- available when at least one project matches. Selecting one of these rows switches to the corresponding tab and pre-filters the table to show only rows that contain your search term. Union portal search dropdown with project and user results ## Select a result **Selecting a project row** opens that project's general settings modal, where you can edit the project name and other settings without leaving the portal. **Selecting a user row** opens a "Projects for \[Name]" modal showing all of the user's memberships in the portal -- the project name, role, status, last active date, invite date, and who invited them. From this modal you can toggle individual membership statuses or click **Deactivate all memberships** to remove the user's access across every project at once. **Selecting a "view N matching..." row** switches to the Projects or Users tab and pre-filters that table to your search term. The filter runs on top of any column filters already in place in the table. ## Clear a table filter applied by search When a "view N matching..." row has filtered a tab's table, a notice appears above the table showing the active term. Click **Clear** in that notice to remove the filter and show all rows again. Table filter banner with a Clear link ## Union admin indicator Users who are project group admins (union admins) appear with a green **Union admin** badge in the search results instead of a project count. Because union admins have access to every project in the group regardless of direct membership, showing a count would understate their actual access level. The same green badge appears in the **Role** column of any memberships table opened through the portal. # Union portal overview Source: https://help.broadstripes.com/docs/admin-guides/union-portal/union-portal-overview The union portal gives project group admins a central place to view and manage all projects in a group, create new projects, and navigate between them. The **union portal** is a dedicated workspace for project group admins (union admins). It shows a dashboard of all projects that belong to a project group and provides tools to [create new projects](/docs/admin-guides/union-portal/create-a-project), [manage project memberships](/docs/admin-guides/union-portal/manage-project-members), and configure group settings. ## Who can access the union portal * **Project group admins (union admins)** can access the portal for the project groups they administer. To open the union portal, open your user menu (the avatar disc in the top-right corner of the navigation bar) while inside a project that belongs to a project group. Select **Union portal** from the menu. ## Navigation The union portal has its own navigation header across the top of the page. Union portal navigation header ### Logo The Broadstripes logo on the left links back to the union portal home page. Clicking it returns you to the portal dashboard from any page within the union portal. ### Search bar A search bar () in the navigation header lets you find projects and users within the group. The search bar focuses automatically when you open the portal, so you can start typing right away without clicking first. Type at least two characters to see matching results. Selecting a project opens that project's general settings modal; selecting a user opens a "Projects for \[Name]" modal listing their memberships. You can also press **Command-K** (Mac) or **Ctrl-K** (Windows and Linux) at any time to return focus to the search bar from the keyboard. Pressing **Escape** or clicking elsewhere moves focus away without clearing what you typed. Clicking the search bar again -- or pressing the keyboard shortcut -- re-runs your previous search automatically so results reload right where you left off. ### Project switcher The **Projects** button () opens the project switcher, letting you navigate directly to any Broadstripes project you have access to without returning to the main app first. The switcher works the same way as in the main app -- you can search by name, sort alphabetically or by recency, and open projects in new tabs. ### User disc The avatar disc in the top-right corner opens your account menu. On the union portal, the menu includes: * **Help center** -- opens the Broadstripes help documentation in a new tab. * **Log out** -- signs you out of Broadstripes. The settings gear that appears in the main app navigation bar is not shown on the union portal. Settings pages are scoped to individual projects, so there are no settings to show when you are browsing the portal itself. The color of your user disc reflects your permission level within the portal: * **Green** -- union admin (project group admin) * **Sky blue** -- basic member ## Portal dashboard The union portal dashboard has two main tabs: **Projects** and **Users**. ### Projects tab The Projects tab lists all projects in the group. For each project, you can open the project, manage its members, and -- if you have the appropriate permissions -- disable or make a project read-only. Union admins can create a new project for the group from the Projects tab. ### Users tab The Users tab lists all users who have membership in any project within the group. Union admins can view and manage memberships across projects from this tab. # Send email Source: https://help.broadstripes.com/docs/communications/bulk-actions-send-email How to compose and send bulk email messages to contacts in Broadstripes, and track delivery status. Broadstripes makes it easy to send a single email to multiple contacts at once. You can compose a rich HTML email or choose from a pre-built [email template](/docs/communications/creating-email-templates), personalize messages with dynamic [merge fields](/docs/communications/using-merge-fields), add attachments, and schedule delivery for later. ## Before you begin * You need **permission to send bulk emails**. If you don't see the **Send email** option in the **Communications** menu, ask your admin to enable it. * Contacts must have a valid email address that is [opted in](/docs/communications/email-messaging-opted-in-permissions) to receive email. Contacts without an opted-in email will be skipped. * Your organization's email domain must be authenticated with the Broadstripes bulk email service. If you see a "Bulk email unavailable" message when you try to send, contact your Broadstripes administrator. ## Open the email drawer 1. Run a [search](/docs/getting-started/search-by-workplace) to find the contacts you want to email. 2. From the **Search Results** page, [select the contacts](/docs/viewing-search-results-and-edit/selecting-deselecting-contacts) you want to email. You can select up to 10,000 contacts at a time. 3. Open the **Communications** dropdown menu and select **Send email**. Communications dropdown menu showing the Send email option The **Send email** drawer opens from the right side of the screen. The header shows how many contacts are selected. You can minimize the drawer to a bottom bar at any time -- your draft is preserved while you continue working. Click the bar to restore the drawer, or click **Discard** in the bar to close the draft entirely. ## Compose your email The email drawer has four sections — **Sender**, **Content**, **Attachments**, and **Recipient addresses** — followed by a **Schedule for later** toggle. The **Recipient addresses** section is covered in [Limiting recipients by address type](#limiting-recipients-by-address-type) below. Send email compose panel showing sender and content options ### Sender * **From address** — Choose the email address that will appear as the sender. The dropdown includes your personal email and any project-level outgoing email addresses that have been set up by your admin. * **Change sender name** — Check this box to override the sender display name for this message only. * **Use different reply-to address** — Check this box to set a different email address for replies. ### Content You have two options for composing your email content: * **Choose a template** — Select a pre-built email template from the dropdown. Templates are created on the [Email Templates](/docs/communications/creating-email-templates) page and can include formatted content with merge fields already configured. * **Compose it now** — Write a rich HTML email using a full-featured editor. This option gives you a **Subject** field and a **Message** editor with a formatting toolbar (bold, italic, font size, alignment, color, links, images, lists, tables, and more). When composing with **Compose it now**, use the toolbar above the form to personalize each email: * ** Merge field** — Opens a searchable picker to insert a dynamic merge field (such as "First name" or "Department") into the Subject or Message. A context label on the button shows which field the insertion will target based on where you last clicked. See [Using merge fields](/docs/communications/using-merge-fields) for details. * **Emoji button** — Inserts an emoji at the last cursor position in the Subject or Message. To preview how your email will look before sending, click **Preview**. The preview pane shows the rendered email with its subject, from address, recipient count, and your project's email footer. You can send directly from the preview pane. ### Attachments Click **Add attachment** to attach files to your email. You can also drag and drop files onto the form or paste from your clipboard. The total size of all attachments must be 10 MB or less. Supported file types include PDFs, common document and spreadsheet formats (Word, Excel, CSV), images (PNG, JPG, GIF), plain text and HTML files, and calendar invite files (.ics). **What is an .ics file, and why attach one?** An **.ics** file is a calendar invitation — a small text file in the standard iCalendar format that holds an event's title, date, time, location, and description. Every major calendar app (Google Calendar, Outlook, Apple Calendar) can read one. When you attach an .ics file to an email, recipients can add your event to their own calendar in a click or two instead of copying the details by hand. That's useful for anything you need people to actually show up to: * Membership meetings, contract-vote sessions, and ratification votes * Rallies, pickets, and actions where turnout is the whole point * Steward trainings, new-member orientations, and committee calls * Deadlines worth a reminder, such as the last day to sign a petition or return a card Because the event lands in the recipient's calendar, they also get whatever reminder alerts they've already set up — so your event resurfaces on its own, without another email from you. **How to create one:** Broadstripes doesn't generate .ics files, so make the event in your own calendar app and export it. In Google Calendar, open the event and choose the option to download or export it; in Outlook and Apple Calendar, use **Save as** or **Export** and pick the iCalendar (.ics) format. Then attach the saved file here. Attachments are available on email only — text messages can't carry an .ics file, so for texting, put the details in the message body instead. ### Schedule for later By default, your email is sent immediately when you click **Send**. To schedule it for a later time, turn on the **Schedule for later** toggle at the bottom of the drawer ("Pick a time or a repeating schedule"). Two tabs appear: * **One time** — Click any highlighted token in the schedule sentence to set the date, time, and time zone. * **Recurring** — Set up a repeating schedule using the same sentence-token editor. This option is only available when all contacts in your current search are selected; otherwise the tab is greyed out and a tooltip explains why. Once you set a schedule, the drawer's **Send** button changes to **Schedule**. **How scheduling affects recipients:** * **One-time scheduled emails** lock in the recipients at the time of scheduling. The contacts who match your search at that moment are the ones who will receive the email. * **Recurring emails** re-run your search each time the email is sent. Make sure your search criteria will continue to return the correct set of recipients. ## Preview your email When composing an email directly (not using a template), you can preview how the message will look before sending it. Click **Preview** at the bottom of the compose panel. The preview pane shows: * How many contacts will receive the email (and how many are excluded) * The **From** address and **Subject** line * A rendered view of your message body, including the unsubscribe footer From the preview pane, click **Send** to send immediately, or click **Edit** to return to the compose form. All your settings -- sender, schedule, and recipient address filter -- are preserved when you go back to edit. **Preview** is only available when you compose the email directly. If you selected a template, use the template editor's built-in preview instead. ## Send the email 1. Review your email content and settings. 2. Click **Send** (or **Schedule** if you set a scheduled time). 3. A confirmation dialog appears showing how many contacts will receive the email. If any contacts in your selection don't have a valid opted-in email address, the dialog shows how many will be excluded. 4. Click **OK** to confirm. Broadstripes queues the email for delivery and displays a confirmation message. ## Limiting recipients by address type By default, Broadstripes emails every opted-in address a contact has. In the **Recipient addresses** section of the **Send email** drawer — between **Attachments** and the **Schedule for later** toggle — you can narrow a send to a single address type, for example sending only to **Personal** addresses and excluding **Business**, or vice versa. This is useful when: * A campaign should only contact members at home, not at work * Your project keeps separate consent records for personal vs. business addresses * You want to avoid emailing employer-controlled inboxes for sensitive organizing communications Choose one of the two options: * **Send message to all opted-in addresses** — the default. * **Send message only to** — then pick a type from the dropdown: **Personal**, **Business**, **Home**, **Other**, **Primary**, or **Non-primary**. When you limit the send to one address type, contacts whose only opted-in email addresses fall outside that type are skipped during sending and counted in the **Not valid** column on the [Sent Email page](#view-sent-emails-and-delivery-stats), even if they are otherwise opted in. This choice applies only to the message you are composing. It isn't saved as a project setting, and there is no administrator-managed list of eligible address types. ## View sent emails and delivery stats After sending, you can track delivery status from the **Sent Email** page. 1. Navigate to the **Email** section by clicking the **Sent Email** tab in the left sidebar, or go to **Communications** in the navigation. 2. The **Sent Email** tab shows an interactive data grid with sortable, filterable columns. Sent email table showing a list of sent messages with delivery statistics The table includes these columns: | Column | Description | | -------------------------- | --------------------------------------------------- | | **#** | Sequential message number | | **From** | The user who sent the email | | **Status** | Current state: Sent, Queued, Scheduled, or Canceled | | **Sent or Scheduled Date** | When the email was sent or is scheduled to send | | **Subject** | The email subject line | | **Selected** | How many contacts were selected | | **Not valid** | How many contacts didn't have a valid email | | **Sent** | How many emails were actually sent | | **Delivered** | How many were confirmed delivered | | **Opens** | How many recipients opened the email | | **Clicks** | How many recipients clicked a link | | **Spam** | How many were marked as spam | | **Failed** | How many failed to deliver | | **Unsubscribed** | How many recipients unsubscribed | Each count in the table is a clickable link that opens a search showing those specific contacts. ### View message details Click the **view** link in the **Actions** column to open the message detail page. This page shows: * **Status** — The current delivery state, with the option to cancel a scheduled message. * **Sent on** — The date and time the email was sent. * **From** — The user who sent the email. * **Selected / Not valid / Sent to** — Counts of contacts at each stage, with links to search results for each group. * **Delivery Stats** — Progress bars showing Delivered, Opens, Clicks, Spam, and Failed counts with percentages. These stats update automatically. * **Subject and Body** — A preview of the email content. Message detail page showing delivery stats and email metadata ## Emails in a contact's timeline When you send an email to a contact, it appears as an entry in their timeline. The entry shows the email subject, who sent it, when it was sent, and a delivery status icon. Click the entry to open the full email in a new tab. # Actions - Send text (send bulk SMS messages) Source: https://help.broadstripes.com/docs/communications/bulk-actions-send-sms-text-message ## Send SMS texts to multiple workers This action allows you to send individual text messages to a group of workers all at once. See the [Text messaging overview](/docs/communications/text-messaging) article and watch the text messaging with Broadstripes video to learn more about using Broadstripes to send (and receive) text messages. If you don't see the **"Text"** option on your drop down menu, it means you haven't been granted permission to use the feature. Talk to your admin to get set up. ## Before you can send a text message Two things need to happen before you start sending texts in Broadstripes: 1. You have to have **permission to send texts**, which an admin can give you. 2. You need a **virtual cell number**, which also must be provided by an admin. Broadstripes uses virtual numbers so that: * organizers don’t have to give out their real cell numbers * if an organizer moves on from a campaign, another team member can continue an ongoing text conversation in their place. You can learn how to complete these prerequisites in the Text messaging overview article which also includes a step-by-step video. To receive notifications when workers reply to your texts, you should also [add your own cell number to your Broadstripes user account](/docs/communications/set-a-sms-notification-number/). This is not required to send messages, but without it you will not receive reply notifications. ## Video: How to set up and use text messaging in Broadstripes