Skip to main content
Call scripts are the heart of the Call Center system. They define the conversation flow, what callers see on their screens, what data gets collected, and how calls are completed. Call script editor 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 Settings menu
  2. Select the Scripts option
  3. Then click the + New Call Script button to start a new script
Scripts tab 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
NODE NodeName
  PROMPT Your message here
  BUTTON Button Text
    TARGET NextNode
Example:
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:
PROMPT <p>Hi {{person.first_name}}, this is {{caller.name}} calling from <strong>Local 123</strong>.</p>
PROMPT <p>According to our records, you work at {{person.employer}}.</p>
BUTTON - Creating navigation options Buttons let callers move through the script:
BUTTON Yes, I'm interested
  TARGET InterestedNode
You can have multiple buttons in a single node:
NODE Start
  PROMPT Would you like to participate?
  BUTTON Yes
    TARGET Participate
  BUTTON No
    TARGET NoThanks
  BUTTON Maybe later
    TARGET Callback
You can also used BUTTON to checkoff event steps. To checkoff an event step, use the following syntax:
BUTTON button label
  EVENT STEP event name : event step name
  TARGET NextNode
Example:
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:
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:
NODE ThankYou
  PROMPT Thank you for your time!
  NEXT GoodbyeNode
CONDITION - Branching logic Use conditions to personalize conversations based on data:
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:
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:
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.:
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:
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:
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)

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 (Settings → Custom Fields)
  2. Optionally mark it as “Show in Call Center” for easier access
  3. Reference it in your script:
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:
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:
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.
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 <p>Hi, may I speak to <strong>{{person.first_name}}</strong>?</p>
  <p>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 <em>{{person.employer}}</em> and about what our union is currently doing to organize and build power.</p>
  <p style="color:#1976d2;">What have you heard so far about what our union is doing?</p>
  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 <p>We'll be happy to call another time. What would be best for you?</p>
  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 <p>If you get voicemail or just no answer, <strong style="color:#d32f2f;">DO NOT LEAVE VOICEMAIL</strong>.</p>
  <p>If the person you're calling has a cell, send them the following text:</p>
  <p style="color:#388e3c;"><strong>Is this a cell phone number?</strong></p>
  <blockquote style="background-color:#f5f5f5;padding:10px;border-left:3px solid #1976d2;">
  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?
  </blockquote>
  CUSTOM FIELD Phone-bank text sent
    LABEL Sent a text
  END

NODE Mark phone bad
  PROMPT <p style="color:#d32f2f;"><strong>Mark this number as BAD</strong></p>
  <p>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 <strong>OK</strong> to <strong>BAD</strong>, indicating that the number should no longer be used.</p>
  <p>If the person has a second number, please click the <strong>Previous Question</strong> button and call that number before marking the call complete.</p>
  <p>Otherwise, please click the <strong>Call complete</strong> button.</p>
  END

NODE Date left employer
  PROMPT <p>Do you know the date you left work?</p>
  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 <p><strong>Thanks for taking a minute to talk.</strong> 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.</p>
  <p>Have you heard about the work the union is doing?</p>
  BUTTON Yes
    TARGET Petition pitch
  BUTTON No
    TARGET Retention work details

NODE Message to Contingent Members
  PROMPT <p><strong>Thanks for taking a minute to talk.</strong> 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.</p>
  <p>Before we get to the details, can I ask if you've seen your hours reduced during the pandemic?</p>
  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 <p>OK. Have you heard about the work the union is doing to preserve our jobs during the pandemic?</p>
  BUTTON Yes
    TARGET Petition pitch
  BUTTON No
    TARGET Retention work details

NODE Message to Retirees
  PROMPT <p><strong>Thanks for taking a minute to talk.</strong> 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.</p>
  <p>We're also working hard to protect the jobs of current members. Have you heard about this campaign?</p>
  BUTTON Yes
    TARGET Petition pitch
  BUTTON No
    TARGET Retention work details

NODE Retention work details
  PROMPT <p>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.</p>
  <p><strong style="color:#d32f2f;">Here's some of what's going on:</strong></p>
  <ul>
  <li>Union negotiators are working with management to obtain commitments to preserve all full-time positions and to rehire contingent workers as soon as it's safe to return to work.</li>
  <li>Union staff are lobbying the governor and our state reps for legislation requiring employers to hold full-time jobs and rehire contingent workers.</li>
  <li>Union legal counsel is carefully reviewing all of our contracts to make sure we're using all available leverage to protect existing jobs.</li>
  </ul>
  NEXT Petition pitch

NODE Petition pitch
  PROMPT <p>To win these battles, the union needs your support.</p>
  <p style="color:#1976d2;"><strong>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?</strong></p>
  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 <p>Later today, I'll send you a link to the petition.</p>
  <p>Would you prefer an email or a text?</p>
  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 <p>Can you tell me what's keeping you from signing the petition?</p>
  CUSTOM FIELD Reason won't sign
  NEXT Goodbye

NODE Ask to Volunteer
  PROMPT <p style="color:#388e3c;"><strong>Can you volunteer to help us reach out to more of our members by making calls from home?</strong></p>
  BUTTON Yes
    EVENT STEP Volunteer : Yes
    TARGET Will volunteer
  BUTTON No
    EVENT STEP Volunteer : No
    TARGET Goodbye

NODE Will volunteer
  PROMPT <p><strong style="color:#388e3c;">Great!</strong> Someone from the union will be in touch with you soon about setting you up to call other members.</p>
  <p>Thank you for being willing to help support the campaign! Goodbye!</p>
  END

NODE Goodbye
  PROMPT <p>Thank you for your time. It was nice talking to you.</p>
  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.
NODE Start
  PROMPT <p>Hi <strong>{{person.first_name}}</strong>, this is {{caller.name}} from <strong>Local 123</strong>.</p>
  <p>Election day is coming up on <span style="color:#d32f2f;">November 5th</span>. Do you have a moment?</p>
  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 <p>That's great to hear! Thank you for your support.</p>
  <p><strong>We'll send you a text reminder before election day.</strong></p>
  <p style="color:#1976d2;"><i>Can we text you at this number?</i></p>
  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 <p>I'll make sure we don't call again.</p>
  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.
NODE Intro
  PROMPT <p>Hi <strong>{{person.first_name}}</strong>, this is {{caller.name}} from <strong>Local 123</strong>.</p>
  <p>We're talking to workers at <em>{{person.employer}}</em> in the <em>{{person.department}}</em> department about workplace issues.</p>
  <p>Do you have 5 minutes?</p>
  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 <p>Perfect! We'll send you the details via text.</p>
  <p style="color:#388e3c;"><strong>Is this the best number to text?</strong></p>
  <p style="color:#757575;font-size:0.9em;"><i>Note: Confirm the phone number before sending.</i></p>
  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.
NODE Welcome
  PROMPT <p>Hi <strong>{{person.first_name}}</strong>, this is {{caller.name}} from <strong>Local 123</strong>.</p>
  <p style="color:#1976d2;"><strong>Welcome to the union!</strong></p>
  <p>We're calling all new members at <em>{{person.employer}}</em> to make sure you have everything you need. Do you have a few minutes?</p>
  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 <p>Perfect! We'll text you a reminder.</p>
  <p style="color:#388e3c;"><strong>Confirm this is the best number:</strong> {{person.custom_fields.[best phone text]}}</p>
  <p style="color:#757575;font-size:0.9em;"><i>Note: Update the best phone custom field if needed before sending.</i></p>
  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.
NODE Start
  PROMPT <p>Hi <strong>{{person.first_name}}</strong>, this is {{caller.name}} from <strong>Local 123</strong>.</p>
  <p>Do you have a few minutes to talk about what's happening with the union?</p>
  BUTTON Yes
    OUTCOME Reached
    TARGET CheckStatus
  BUTTON No, call back later
    TARGET Callback

NODE CheckStatus
  CONDITION MemberStatus
    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 <p><strong>Great!</strong> I see you're an active member at <em>{{person.employer}}</em> in the <em>{{person.department}}</em> department.</p>
  <p>We're reaching out about our upcoming <span style="color:#d32f2f;"><strong>contract negotiations</strong></span>.</p>
  <p>Your job title is listed as <em>{{person.job_title}}</em> - is that still accurate?</p>
  <p style="color:#1976d2;">Are you interested in getting involved?</p>
  BUTTON Yes, I'm interested
    TARGET CommitteeSignup
  BUTTON Tell me more
    TARGET ExplainCampaign
  BUTTON Not right now
    TARGET Thanks

NODE InactiveMemberPath
  PROMPT <p>Hi {{person.first_name}}, we noticed you haven't been active recently with the union.</p>
  <p style="color:#f57c00;"><strong>We'd love to reconnect!</strong></p>
  <p>What's been going on?</p>
  BUTTON Work schedule conflicts
    TARGET ScheduleConflict
  BUTTON Lost interest
    TARGET ReengageInterest
  BUTTON Just haven't had time
    TARGET TimeConstraints

NODE NewMemberPath
  PROMPT <p style="color:#388e3c;"><strong>Welcome {{person.first_name}}!</strong></p>
  <p>We're excited to have you as a member. Let me tell you about what we're working on.</p>
  NEXT NewMemberInfo

NODE GeneralOutreach
  PROMPT <p>Thanks for taking my call, {{person.first_name}}.</p>
  <p>We're reaching out to members at <em>{{person.employer}}</em> about our current campaign.</p>
  <p>Would you like to hear more?</p>
  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 <p>I appreciate your honesty.</p>
  <p>Things have changed since you were last involved. We're now focused on <strong style="color:#d32f2f;">{{person.custom_fields.[current campaign text]}}</strong>.</p>
  <p>Does that sound interesting?</p>
  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 <p>We're working to improve wages, benefits, and working conditions.</p>
  <p>Your <em>{{person.department}}</em> department has been particularly vocal about <strong style="color:#d32f2f;">{{person.custom_fields.[department priority issue text]}}</strong>.</p>
  <p>We'd love your input as someone who works as a <em>{{person.job_title}}</em>.</p>
  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:
BUTTON Continue
  TARGET NextNodeNextNode 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
BUTTON Continue
  TARGET ThankYouChanged to existing node

Error: “Duplicate node name”

Cause: Two nodes have the same name. Example:
NODE Start
  PROMPT Hi there!

NODE StartDuplicate!
  PROMPT Welcome!
Solution: Rename one of the nodes to be unique.
NODE Start
  PROMPT Hi there!

NODE Welcome
  PROMPT Welcome!

Error: “Missing PROMPT in node”

Cause: A node exists without a PROMPT statement. Example:
NODE MyNode
  BUTTON Continue
    TARGET NextNode
Solution: Add a PROMPT.
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
    • Go to the Settings menu and select 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.