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.
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.
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.
Where to create call scripts
Project admins create call scripts on the Call Center settings page. To get to the Call Center settings page:
- Click the Settings menu
- Select the Scripts option
- Then click the + New Call Script button to start a new script
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:
- Nodes: Individual screens or conversation points
- Prompts: Text displayed to the caller
- Buttons: Options the caller can click to move through the script
- Transitions: Connections between nodes
- 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.
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:
- The custom field must exist in your project (Settings → Custom Fields)
- Optionally mark it as “Show in Call Center” for easier access
- 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 NextNode ← NextNode is not defined anywhere
Solution:
- Find where the node is referenced
- Either create the missing node or change the target to an existing node
BUTTON Continue
TARGET ThankYou ← Changed to existing node
Error: “Duplicate node name”
Cause: Two nodes have the same name.
Example:
NODE Start
PROMPT Hi there!
NODE Start ← Duplicate!
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
-
Navigate to script page
- Go to the Settings menu and select Scripts
- Click New call script
-
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
-
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
-
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
-
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
-
Save as draft
- Click Save to save your script
-
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.