Notify.gov is a product of the Public Benefits Studio, a product accelerator inside
the federal government.
diff --git a/app/templates/views/check/ok.html b/app/templates/views/check/ok.html
index 015cb1ee1..71324b724 100644
--- a/app/templates/views/check/ok.html
+++ b/app/templates/views/check/ok.html
@@ -2,7 +2,6 @@
{% from "components/banner.html" import banner_wrapper %}
{% from "components/page-header.html" import page_header %}
{% from "components/components/button/macro.njk" import usaButton %}
-{% from "components/components/skip-link/macro.njk" import usaSkipLink %}
{% from "components/components/back-link/macro.njk" import usaBackLink %}
{% set file_contents_header_id = 'file-preview' %}
diff --git a/app/templates/views/check/preview.html b/app/templates/views/check/preview.html
index a4e921ce4..6e0122499 100644
--- a/app/templates/views/check/preview.html
+++ b/app/templates/views/check/preview.html
@@ -3,7 +3,6 @@
{% from "components/table.html" import list_table, field, text_field, hidden_field_heading %}
{% from "components/page-header.html" import page_header %}
{% from "components/components/button/macro.njk" import usaButton %}
-{% from "components/components/skip-link/macro.njk" import usaSkipLink %}
{% from "components/components/back-link/macro.njk" import usaBackLink %}
{% set file_contents_header_id = 'file-preview' %}
diff --git a/app/templates/views/join-notify.html b/app/templates/views/join-notify.html
new file mode 100644
index 000000000..2c154bf72
--- /dev/null
+++ b/app/templates/views/join-notify.html
@@ -0,0 +1,212 @@
+{% extends "base.html" %}
+
+{% set page_title = "Join Notify" %}
+
+{% block per_page_title %}{{page_title}}{% endblock %}
+
+{% block content_column_content %}
+
+
+
{{page_title}}
+
Who is Notify.gov for?
+
+ Government agencies at any level of government who deliver federal programs are able to use Notify.gov. Those
+ who sign up to new Notify.gov become our partners.
+
+
+ All federal agencies are invited to use Notify.gov to send text messages to their employees, other federal
+ agencies, or to the public.
+
+
+
+ Non-federal agencies (state, local, territorial, or tribal governments) who administer or deliver federally-funded
+ services
+ may qualify to use Notify.gov. These programs must specify which federal program the messages they want to
+ send are related to. The Notify.gov team confirms our authority to work with these programs as part of our
+ agreements process.
+
+
What partners receive
+
+ To use Notify.gov to send messages (outside of our Trial Mode), partners sign a one-year Memorandum of Understanding
+ with us. This is a basic agreement outlining our relationship and responsibilities.
+
+
Our core, no-cost, service offering includes:
+ {% set product_highlights = [
+ {
+ "svg_src": "#chat",
+ "card_heading": "Up to 250,000 messages to use over your first year*",
+ },
+ {
+ "svg_src": "#phone",
+ "card_heading": "One toll-free sending phone number",
+ },
+ {
+ "svg_src": "#forum",
+ "card_heading": "An easy-to-use web-based interface for sending bulk or individual messages",
+ },
+ {
+ "svg_src": "#assessment",
+ "card_heading": "Dashboards and downloadable reports for tracking message delivery",
+ },
+ ] %}
+
+ {% for item in product_highlights %}
+
+
+
+
+ {{item.card_heading}}
+
+
{{item.p_text}}
+
+
+ {% endfor %}
+
+
*We plan to offer plans with additional messages soon; please contact us if you need more
+ messages so that we can understand your use case!
+
+
How to get started
+
+
+
+
Interested in trying Notify.gov before signing an agreement? We can provide qualifying partners with access
+ to Trial Mode to review Notify.gov features before deciding. In Trial Mode, you can test sending messages,
+ explore the personalization and customization features, and review sample delivery reports.
+
+
+
+
+
Tell us about your program
+
+ Let’s determine if Notify.gov is a good fit for your organization. To get started, we’ll ask you for
+ information such as:
+
+ {% set bullet_items = [
+ "Organization name and type",
+ "Point of contact’s name and email address",
+ "Your associated federal funding, program, or authority",
+ "The program(s) you want to text about",
+ "Who you are planning to text",
+ "What you’d like to achieve by texting these people",
+ "The estimate number of texts you’d like to send in the first year",
+ "Who would you like to include on the Trial Mode account?",
+ "Provide the official government email address to invite your team members",
+ "When would you like to send your first text(s)?"
+ ] %}
+
+ Our team will review the information you provide, and follow up with any questions. We’ll contact you no matter your
+ qualification status.
+
+
+ We provide you a one-year, Memorandum of Understanding (MOU). To text the public fully in Live Mode, your
+ organization will need to sign our MOU.
+
+
+
Getting Started FAQs
+ {% set accordion_content = [
+ {
+ "heading": "What if I need more than 250,000 messages?",
+ "p_text": "Plans that include additional messages for a fee will be available soon. We want to design these plans
+ based on our partners’ needs, so please contact us if you hope to be able to
+ send more messages. We’d like to talk with you.",
+ "position": "b-a1"
+ },
+ {
+ "heading": "What phone numbers can my agency send to?",
+ "p_text": "Right now, Notify.gov supports sending messages to North American numbers (+1). If you’d like to send to
+ international numbers, we want to hear from you.",
+ "position": "b-a2",
+ },
+ {
+ "heading": "Can we send from a shortcode or an existing customer service number?",
+ "p_text": "At this time, Notify.gov provides toll-free service numbers. We will be exploring offering shortcodes in
+ the near future. If you wish to send from an existing phone number owned or operated by your agency, this is something
+ that might be possible in the future, but is not currently on our roadmap.",
+ "position": "b-a3",
+ },
+ {
+ "heading": "Can we use API integrations with Notify?",
+ "p_text": "While public API integrations are not yet available, we are working on enabling these. If you're looking
+ for this feature we want to hear from you.",
+ "position": "b-a4",
+ },
+ {
+ "heading": "My IT team has questions about how Notify.gov is built, where can I direct them to more information?",
+ "p_text": "To understand how Notify.gov works, see our Security page for the
+ basics. If your IT team needs more
+ information we’re happy to share a larger security package upon request.",
+ "position": "b-a5",
+ },
+ {
+ "heading": "How does Notify.gov support our records retention policy?",
+ "p_text": "We are not a System of Record. For more see our Security page.",
+ "position": "b-a6",
+ },
+ {
+ "heading": "My OGC is asking about consent, where can I get more information for them?",
+ "p_text": "Text message notifications are governed by the Telephone Consumer Protection Act. Different levels of
+ government have different consent requirements. Download and share our overview of the
+ TCPA with your legal counsel as
+ a starting point.",
+ "position": "b-a7",
+ },
+ {
+ "heading": "What information does Notify provide about message delivery?",
+ "p_text": "Notify.gov shares back information about message delivery that we receive from individual mobile phone
+ carriers. Carriers can only provide information about whether a message was successfully delivered to a specific phone
+ number (not a person).
+
+ If you happen to send a message to a landline or out-of-service phone number, these messages will show up as ‘failed’
+ in delivery reports.",
+ "position": "b-a8",
+ },
+ {
+ "heading": "Can I track engagement with the messages I send?",
+ "p_text": "Unlike email, you cannot see if someone reads a message or clicks on a link you included in a message. This
+ is a limitation of SMS in general, not Notify.gov. We do highly recommend setting goals for your texting campaigns and
+ tracking performance. By combining the delivery reports provided by Notify.gov with other information from your
+ program, you may be able to assess engagement and impact.",
+ "position": "b-a9",
+ },
+ {
+ "heading": "Is there technical product support offered?",
+ "p_text": "We’re on call to answer any questions as you get started using Notify.gov",
+ "position": "b-a10",
+ },
+ ] %}
+
Reach people where they are with government-powered text messages
-
Notify.gov is a text message service that helps federal, state, local, tribal and territorial governments more effectively communicate with the people they serve.
Currently we are only working with select pilot partners. If you are interested in using Notify.gov in the future, please contact tts-benefits-studio@gsa.gov to learn more.
-
-
-
-
-
-
-
-
-
-
-
- Control your content
-
-
You do not need any technical knowledge to create message templates.
-
-
-
-
-
-
-
-
-
-
- See how your messages perform
-
-
Track how many messages you’ve sent and find out which ones are not being delivered.
-
-
-
-
-
-
-
-
-
-
- No technical integration needed
-
-
Upload a spreadsheet of phone numbers and Notify.gov sends batches of messages for you.
-
-
-
-
-
-
-
-
-
-
- About the product
-
-
- Keeping program participants updated on status changes, due dates, and appointments can be a huge challenge, and many
- recipients fall through the cracks, ultimately losing their benefits. In the benefits space, data shows that sending
- text messages helps decrease re-enrollment churn and save money for administering agencies.
-
-
- Notify.gov is an easy text messaging platform that helps government agencies provide program participants with one-way
- reminders and updates. With minimal set-up and secure, personalized messaging, Notify.gov helps agencies include text
- messaging as part of their outreach program. Administering agencies can quickly assess the impact of text messaging for
- their programs, after which they can build a case to expand their texting program if they choose to.
-
-
- Notify.gov is a new shared service currently being piloted by the Public Benefits Studio, within Technology
- Transformation Services at the General Services Administration.
-
-
- Who's Eligible?
-
-
- Eligible partners include federal agencies as well as state, local, territorial, tribal agencies
- administering federally funded programs. As part of the onboarding process, non-federal
- programs must specify the federal program that the messages they want to send are related
- to. TTS will also seek concurrence from the federal funder.
-
-
- We prioritize partnerships focused on use cases related to increasing transparency and
- reducing the burden of navigating government programs for low income individuals and
- families.
-
-
+
+
+
+
+
+
+
+
+ Government texting made easy
+
+
+ Notify.gov is a text messaging platform built for government agencies.
+ With minimal set-up and secure, personalized messaging, you can make
+ one-way texting a part of your outreach program.
+
+
-
+
+
Key features
+
+
+
+
+
+
+
Web-based
+
+
+
Nothing to download or install
+
+
+
+
+
+
+
+
Fast and easy
+
+
+
No technical expertise required
+
+
+
+
+
+
+
+
Track message delivery
+
+
+
See which messages were received
+
+
+
+
+
+
+
+
+
+
Send in recipients' preferred language
+
+
+
Notify.gov has support for more than 30 character sets
+
+
+
+
+
+
+
+
Security and privacy
+
+
+
+ Limited data retention, encryption, and multi-factor authentication
+ protect user data and manage risk
+
+
+
+
+
+
+
+
+
Send bulk, customized, one-way messages
+
+
+
+ Send hundreds or thousands of individually customized messages with
+ just a few clicks
+
+
+
+
+
+
+
-
- {% endblock %}
-
+ {% endblock %}
+
{% endblock %}
diff --git a/tests/app/main/views/test_index.py b/tests/app/main/views/test_index.py
index e32ca11ea..3a4c281b9 100644
--- a/tests/app/main/views/test_index.py
+++ b/tests/app/main/views/test_index.py
@@ -20,21 +20,14 @@ def test_non_logged_in_user_can_see_homepage(
"Reach people where they are with government-powered text messages"
)
- assert (
- page.select_one(
- "a.usa-button.login-button.login-button--primary.margin-right-2"
- ).text
- == "Sign in with \n"
+ # Assert the entire HTML of the button to include the image
+ button = page.select_one(
+ "a.usa-button.login-button.login-button--primary.margin-right-2"
)
- assert page.select_one("meta[name=description]") is not None
- # This area is hidden for the pilot
- # assert normalize_spaces(page.select_one('#whos-using-notify').text) == (
- # 'Who’s using Notify.gov ' # Hiding this next area for the pilot
- # # Hiding this next area for the pilot
- # # 'See the list of services and organizations. '
- # 'There are 111 Organizations and 9,999 Services using Notify.'
- # )
+ assert "Sign in with" in button.text.strip() # Assert button text
+ assert button.find("img")["alt"] == "Login.gov logo" # Assert image presence
+ assert page.select_one("meta[name=description]") is not None
assert page.select_one("#whos-using-notify a") is None
@@ -125,7 +118,7 @@ def test_static_pages(client_request, mock_get_organization_by_domain, view, moc
"write_for_action",
"multiple_languages",
"benchmark_performance",
- "guidance_index"
+ "guidance_index",
]
return (
not current_app.config["FEATURE_BEST_PRACTICES_ENABLED"]
diff --git a/tests/app/main/views/test_template_folders.py b/tests/app/main/views/test_template_folders.py
index bb31c8f41..f418b2c42 100644
--- a/tests/app/main/views/test_template_folders.py
+++ b/tests/app/main/views/test_template_folders.py
@@ -350,9 +350,13 @@ def test_should_show_templates_folder_page(
assert normalize_spaces(page.select_one("h1").text) == expected_title_tag
# remove this line if you don't want the breadcrumb on the first page
- assert len(page.select("nav#breadcrumb-template-folders a")) == len(expected_parent_link_args)
+ assert len(page.select("nav#breadcrumb-template-folders a")) == len(
+ expected_parent_link_args
+ )
- for index, parent_link in enumerate(page.select("nav#breadcrumb-template-folders a")):
+ for index, parent_link in enumerate(
+ page.select("nav#breadcrumb-template-folders a")
+ ):
assert parent_link["href"] == url_for(
"main.choose_template",
service_id=SERVICE_ONE_ID,
diff --git a/tests/app/main/views/test_templates.py b/tests/app/main/views/test_templates.py
index db246ea6a..eed5085ec 100644
--- a/tests/app/main/views/test_templates.py
+++ b/tests/app/main/views/test_templates.py
@@ -69,7 +69,9 @@ def test_should_show_empty_page_when_no_templates(
service_id=service_one["id"],
)
- assert normalize_spaces(page.select_one("h1").text) == ("Select or create a template")
+ assert normalize_spaces(page.select_one("h1").text) == (
+ "Select or create a template"
+ )
assert normalize_spaces(page.select_one("main p").text) == (expected_message)
assert page.select_one("#add_new_folder_form")
assert page.select_one("#add_new_template_form")
@@ -87,7 +89,9 @@ def test_should_show_add_template_form_if_service_has_folder_permission(
service_id=service_one["id"],
)
- assert normalize_spaces(page.select_one("h1").text) == ("Select or create a template")
+ assert normalize_spaces(page.select_one("h1").text) == (
+ "Select or create a template"
+ )
assert normalize_spaces(page.select_one("main p").text) == (
"Every message starts with a template. You can change it later. "
"You need a template before you can send messages."
diff --git a/tests/app/test_navigation.py b/tests/app/test_navigation.py
index a7a19b567..0d75e524f 100644
--- a/tests/app/test_navigation.py
+++ b/tests/app/test_navigation.py
@@ -125,6 +125,7 @@ EXCLUDED_ENDPOINTS = tuple(
"integration_testing",
"invite_org_user",
"invite_user",
+ "join_notify",
"link_service_to_organization",
"live_services",
"live_services_csv",
diff --git a/tests/end_to_end/test_landing_and_sign_in_pages.py b/tests/end_to_end/test_landing_and_sign_in_pages.py
index 3cd17ad3a..3741a3a19 100644
--- a/tests/end_to_end/test_landing_and_sign_in_pages.py
+++ b/tests/end_to_end/test_landing_and_sign_in_pages.py
@@ -26,149 +26,24 @@ def test_landing_page(end_to_end_context):
name="Reach people where they are with government-powered text messages",
)
sign_in_button = page.get_by_role("link", name="Sign in with")
- benefits_studio_email = page.get_by_role("link", name="tts-benefits-studio@gsa.gov")
# Check to make sure the elements are visible.
expect(main_header).to_be_visible()
expect(sign_in_button).to_be_visible()
- expect(benefits_studio_email).to_be_visible()
# Check to make sure the sign-in button and email links are correct.
href_value = sign_in_button.get_attribute("href")
assert href_value is not None, "The sign-in button does not have an href attribute"
- expect(benefits_studio_email).to_have_attribute(
- "href", "mailto:tts-benefits-studio@gsa.gov"
- )
# Retrieve all other main content headers and check that they're
# visible.
content_headers = [
- "Control your content",
- "See how your messages perform",
- "No technical integration needed",
- "About the product",
+ "Government texting made easy",
+ "Key features",
+ "Who can use Notify.gov",
]
for content_header in content_headers:
expect(
page.get_by_role("heading", name=re.compile(content_header))
).to_be_visible()
-
-
-# def test_sign_in_and_mfa_pages(end_to_end_context):
-# # Open a new page and go to the staging site.
-# page = end_to_end_context.new_page()
-# page.goto(f"{E2E_TEST_URI}/")
-# print(f"test_sign_in_and_mfa_pages initial {page}")
-#
-# sign_in_button = page.get_by_role("link", name="Sign in")
-#
-# # Test trying to sign in.
-# sign_in_button.click()
-#
-# # Check to make sure that we've arrived at the next page.
-# page.wait_for_load_state("domcontentloaded")
-#
-# # Check the page title exists and matches what we expect.
-# expect(page).to_have_title(re.compile("Sign in"))
-#
-# # Check for the sign in heading.
-# sign_in_heading = page.get_by_role("heading", name="Sign in")
-# expect(sign_in_heading).to_be_visible()
-#
-# # Check for the sign in form elements.
-# # NOTE: Playwright cannot find input elements by role and recommends using
-# # get_by_label() instead; however, hidden form elements do not have
-# # labels associated with them, hence the XPath!
-# # See https://playwright.dev/python/docs/api/class-page#page-get-by-label
-# # and https://playwright.dev/python/docs/locators#locate-by-css-or-xpath
-# # for more information.
-# email_address_input = page.get_by_label("Email address")
-# password_input = page.get_by_label("Password")
-# csrf_token = page.locator('xpath=//input[@name="csrf_token"]')
-# continue_button = page.get_by_role("button", name=re.compile("Continue"))
-# forgot_password_link = page.get_by_role("link", name="Forgot your password?")
-#
-# # Make sure form elements are visible and not visible as expected.
-# expect(email_address_input).to_be_visible()
-# expect(password_input).to_be_visible()
-# expect(continue_button).to_be_visible()
-# expect(forgot_password_link).to_be_visible()
-#
-# expect(csrf_token).to_be_hidden()
-#
-# # Make sure form elements are configured correctly with the right
-# # attributes.
-# expect(email_address_input).to_have_attribute("type", "email")
-# expect(password_input).to_have_attribute("type", "password")
-# expect(csrf_token).to_have_attribute("type", "hidden")
-# expect(continue_button).to_have_attribute("type", "submit")
-# expect(forgot_password_link).to_have_attribute("href", "/forgot-password")
-#
-# # Sign in to the site.
-# email_address_input.fill(os.getenv("NOTIFY_E2E_TEST_EMAIL"))
-# password_input.fill(os.getenv("NOTIFY_E2E_TEST_PASSWORD"))
-# print(f"email and password {os.getenv('NOTIFY_E2E_TEST_EMAIL')} {os.getenv('NOTIFY_E2E_TEST_PASSWORD')}")
-# continue_button.click()
-#
-# # Wait for the next page to fully load.
-# page.wait_for_load_state("domcontentloaded")
-#
-# # Check the page title exists and matches what we expect.
-# print(f"test_sign_in_and_mfa_pages finally is {page}")
-# expect(page).to_have_title(re.compile("Check your phone"))
-#
-# # Check for the sign in heading.
-# sign_in_heading = page.get_by_role("heading", name="Check your phone")
-# expect(sign_in_heading).to_be_visible()
-#
-# # Check for the sign in form elements.
-# # NOTE: Playwright cannot find input elements by role and recommends using
-# # get_by_label() instead; however, hidden form elements do not have
-# # labels associated with them, hence the XPath!
-# # See https://playwright.dev/python/docs/api/class-page#page-get-by-label
-# # and https://playwright.dev/python/docs/locators#locate-by-css-or-xpath
-# # for more information.
-# mfa_input = page.get_by_label("Text message code")
-# csrf_token = page.locator('xpath=//input[@name="csrf_token"]')
-# continue_button = page.get_by_role("button", name=re.compile("Continue"))
-# not_received_message_link = page.get_by_role(
-# "link", name="Not received a text message?"
-# )
-#
-# # Make sure form elements are visible and not visible as expected.
-# expect(mfa_input).to_be_visible()
-# expect(continue_button).to_be_visible()
-# expect(not_received_message_link).to_be_visible()
-#
-# expect(csrf_token).to_be_hidden()
-#
-# # Make sure form elements are configured correctly with the right
-# # attributes.
-# expect(mfa_input).to_have_attribute("type", "tel")
-# expect(mfa_input).to_have_attribute("pattern", "[0-9]*")
-# expect(csrf_token).to_have_attribute("type", "hidden")
-# expect(continue_button).to_have_attribute("type", "submit")
-# expect(not_received_message_link).to_have_attribute("href", "/text-not-received")
-#
-# # Enter MFA code and continue.
-# # TODO: Revisit this at a later point in time.
-# # totp = pyotp.TOTP(
-# # os.getenv('MFA_TOTP_SECRET'),
-# # digits=int(os.getenv('MFA_TOTP_LENGTH'))
-# # )
-#
-# # mfa_input.fill('totp.now()')
-# # continue_button.click()
-#
-# # # Check to make sure that we've arrived at the next page.
-# # page.wait_for_load_state('domcontentloaded')
-#
-# # # Check that no MFA code error happened.
-# # code_not_found_error = page.get_by_text('Code not found')
-# # expect(code_not_found_error).to_have_count(0)
-#
-# # # Check the page title exists and matches what we expect.
-# # # This could be either the Dashboard of a service if there is only
-# # # one, or choosing a service if there are multiple.
-# # expect(page).to_have_title(re.compile('Dashboard|Choose service'))