G9Push Documentation
Everything you need to set up G9Push, install the self-hosted push server on your own hosting, manage subscribers across multiple websites, and recover from common issues. Last updated June 23, 2026.
1. What is G9Push?#
G9Push is a complete web-push notification platform you can self-host. You buy a license from G9Push.com, download the push-server software, install it on your own hosting, and use it to collect browser subscribers and send them notifications. Your subscribers and analytics stay on your server β G9Push.com only validates your license.
Two computers are involved: (a) G9Push.com, which we run, where you sign up, pay,
and download the software; and (b) your hosting (e.g. push.yoursite.com),
which you run, where the push notifications are actually sent and where your subscriber list lives.
2. The two parts you'll run#
| Part | What it does | Lives at |
|---|---|---|
| G9Push.com account | Sign up, verify your email, pick a plan, generate license keys, download the software ZIP, and manage your installations. | https://g9push.com |
| Push server | Where browsers subscribe, where notifications are sent from, where the subscriber list lives. Talks to G9Push.com only to validate your license. | https://your-domain.com/ (your hosting) |
3. Quick start checklist#
- Create an account on @/register.php and verify your email.
- Pick the 7-day trial or the paid package.
- Open your dashboard β Installations β Add Installation. Enter the domain your push server will live on. Copy the license key shown.
- From the same page, click Download Software. Upload the ZIP contents to your hosting.
- Open
https://your-domain.com/admin/setup.php. Paste the license key. Create the admin account. - Inside the push admin: Add Website, copy the embed snippet, paste it into your customer-facing site.
- People who click "Allow" become subscribers. Send your first campaign from the admin panel.
4. Create an account#
- Go to https://g9push.com/register.php (also accessible via the Sign Up button in the top right).
- Fill in your name, email, phone (optional unless phone verification is required by the admin), and password (8+ characters).
- Submit. You'll land on a "Check your inbox" page.
If you clicked "Start Free Trial" or "Get $20 Package" on the pricing section first, the same registration form is used and your plan choice is remembered until you confirm it after signing in.
5. Verify your email#
- Open your inbox. Look for an email from G9Push.
- Click "Confirm my email". The link is valid for 24 hours.
- You'll be taken to a confirmation page. Click Sign in.
Check spam first. If it really hasn't arrived after 1β2 minutes, click Resend it from the link below the sign-in form. If multiple resends fail, the SMTP on the G9Push.com side may be misconfigured β contact support@g9push.com.
6. Sign in#
- Go to https://g9push.com/dashboard/login.php.
- Enter your email and password.
- If you have a pending plan choice and haven't activated it yet, you'll land on the Plan confirmation screen. Click Activate.
- If phone verification is required (admin setting), you'll be sent to
/verify-phone.phpnext. - Otherwise you land on the Installations dashboard.
Use Forgot password on the sign-in page. You'll get a reset link by email.
7. Phone (SMS) verification#
If the G9Push.com admin has turned on Require phone verification, the first time you sign in after
verifying your email you'll be sent to /verify-phone.php. Two paths exist depending on what SMS
provider the admin configured:
7a. MSG91 widget (preferred)
- The page shows "Sending code to <your phone>β¦"
- An SMS arrives with a 6-digit code.
- Type it in the input field. Click Verify.
- On success the page jumps to plan-confirm (if you have a pending plan) or to Installations.
7b. Server-side OTP (fallback)
If MSG91's widget isn't configured, the system generates its own 6-digit code and texts it via the configured SMS provider (Twilio / MSG91 sendhttp / etc.). Same UX, same outcome.
Click Resend code. If multiple retries fail, the provider's balance may be exhausted, the sender ID may not be approved, or your number may be outside the provider's covered countries β contact support.
You need three different values from MSG91, all in different places on their dashboard:
- Widget ID (Verify / OTP widget config page, ~24 hex chars)
- Widget tokenAuth (same page, long JWT with dots)
- Account Auth Key (top-right profile menu β Auth Key, ~24 alphanumeric chars, not a JWT)
Pasting the wrong one in the wrong field is the #1 cause of "HTTP 400 Authentication Failure". Use the in-app Test authkey now button under admin β Settings to verify your key directly with MSG91 before launching.
8. Plans & pricing#
| Plan | What you get | How long |
|---|---|---|
| Free Trial | Full access to one push-server installation. | 7 days (admin-configurable) |
| Paid Package | One push-server installation, can host unlimited websites underneath it. Manage up to 6+ websites with one license. | One-time payment, no recurring fee |
You can host multiple customer-facing websites under one push-server installation. Each website you add inside the push admin is a "site" β and they all share the same master VAPID key automatically. See Β§26 Managing 2+ sites on one license.
9. Coupons#
If you have a coupon code, paste it on the Checkout screen for the paid package. Two coupon types:
- Percent off (e.g. 20% off the package price)
- Fixed amount off (e.g. $5 off)
Coupons can be tied to affiliates for revenue sharing β that's handled on the admin side.
10. Download the software#
- Sign in to your G9Push.com dashboard.
- Go to Installations.
- Click Add Installation. Enter the domain your push server will live on (e.g.
push.yoursite.com). Give it a friendly name. - The page shows your license key β copy it now and store it somewhere safe (it's shown once).
- Click Download Software. You'll get a ZIP file (typically ~250 KB).
The license key is displayed in plain text once. After that the server only stores a hash for security. If you lose it, you can either generate a 30-minute installation token on the same page (better for setup), or ask the admin to issue a new license for you β see Β§34.
11. Upload to your hosting#
- Unzip
g9push-software-YYYYMMDD.zipon your computer. - Inside is a folder
g9push-software/. Upload the contents (not the folder itself) to your hosting's web root for the push subdomain.
For example, if your push domain ispush.yoursite.commapped to/var/www/push/, upload there so that/var/www/push/admin/setup.phpexists. - Make sure your hosting has PHP 7.4+ (PHP 8.x recommended), MySQL/MariaDB, and the OpenSSL + cURL + GMP/BCMath PHP extensions enabled (all standard).
12. Database configuration#
- Create a new MySQL database via your hosting control panel (cPanel / Plesk / shell). Note the host, database name, user, password.
- Import
sql/push_notifications_schema.sqlinto the new database (phpMyAdmin β Import). - Rename
api/config.example.phptoapi/config.phpand fill in your credentials:
<?php
define('DB_HOST', 'localhost');
define('DB_NAME', 'your_database_here');
define('DB_USER', 'your_db_user');
define('DB_PASS', 'your_db_password');
// Optional Redis cache (leave host empty to disable).
define('REDIS_HOST', '');
define('REDIS_PORT', 6379);
define('REDIS_PASS', null);
try {
$pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4", DB_USER, DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
die(json_encode(['error' => 'Database connection failed']));
}
13. Run the setup wizard#
- Open
https://your-domain.com/admin/setup.phpin a browser. - Step 1: Database check. Should pass instantly if
api/config.phpis correct. If it fails, fix the credentials and reload. - Step 2: License. Two modes:
- License key: paste the long key from your dashboard.
- Installation token: paste a 30-minute one-shot token (better β it can't be replayed). Generate one on the Installations page.
- Step 3: Admin account. Enter an admin email + password (8+ chars). Click Create admin & sign in.
- You're now auto-signed-in to
/admin/index.phpβ the push admin panel.
This means PHP cannot write to the disk path it tried. The wizard now lists candidate paths it tried; the
file ends up in the first writable one. If all candidates fail, set
define('G9PUSH_LICENSE_FILE', '/absolute/path/that/is/writable/license.php');
in api/config.php and re-run. See Β§32.
14. Where the license is stored#
The license cache is a small PHP file that the server checks on every request. It picks the first writable location from:
- An explicit override via
G9PUSH_LICENSE_FILEconstant (set inapi/config.php). <parent-of-webroot>/.g9push-license/license.php(most secure)<install-root>/.storage/license.php<install-root>/api/.g9push-cache/license.php- PHP's
session_save_path()directory (universally writable) - System temp directory (last resort)
The file is auto-created. On most hosting one of the first three works; PHP's session path is the bulletproof fallback because if sessions don't work, nothing on your site works.
15. Sign in to your push admin#
- Open
https://your-domain.com/admin/login.php. - Enter the admin email + password you set in step 13.
- You land on the dashboard.
16. Add a website#
Each "website" inside your push admin is a separate place where you'll collect subscribers (e.g. one site for your blog, another for your shop). One installation can host as many sites as you want.
- In the push admin sidebar, click Manage Sites.
- Click Create Website. Enter:
- Name: e.g. "Main blog"
- Domain: the customer-facing domain where you'll embed the snippet (e.g.
yourblog.com) - Bell widget + Soft-ask: optional opt-in styles
- Initial / retry delay: when to first show the prompt
- Click Create Website. The new site appears in the sidebar.
When you create a new website, the push admin copies the same master VAPID keypair from your oldest site. This is intentional β it means you can freely move/copy subscribers between your own sites (see Β§27) and they keep working.
17. VAPID keys explained#
A VAPID keypair is the cryptographic identity your push server uses to sign every notification. The browser stores the public half against each subscription when it's created; the push service (Google FCM / Mozilla / Apple) verifies the signature against that stored key before delivering. If the keys don't match, the push is rejected with HTTP 403 (or 410 once the subscription is invalidated).
What the panel shows
Each site has three columns in the database: vapid_public, vapid_private_enc, vapid_private_pem. All three are filled automatically when you create a site.
Are all my sites on the same key?
Push admin β Import/Export tab β VAPID key alignment table. Each row shows a site + its key fingerprint + β/β. If everything is β, all sites share one key, and cross-site transfer works.
It is the single most destructive button in the panel. Regenerating instantly invalidates every subscriber
on every site β they have to revisit your site and click Allow again to come back. There is no recovery; the
browser holds the keys, not you. The button is now red, labelled "(DANGER)", and requires typing WIPE ALL SUBSCRIBERS
to proceed. Don't.
18. Embed snippet / WordPress plugin#
Plain HTML site
Push admin β click a site β Integration β copy the snippet. Paste it just before </body> on every page of the customer-facing site. Done.
WordPress
Same screen has a WP Plugin button that downloads a one-click plugin pre-configured for that site. Install it on WordPress like any other plugin and activate. No copy-paste needed.
Shopify / other
Paste the snippet into the theme's footer / global include.
19. How a subscription works (the mailbox analogy)#
The cleanest way to think about a push subscription:
- A person visits your site and clicks Allow. Their browser asks the push service (Google for Chrome, Mozilla for Firefox) to create a mailbox for them.
- The push service creates the mailbox and gives the browser an address (a URL like
https://fcm.googleapis.com/fcm/send/...). The browser hands this address to your server. - Your server writes the address down in the
subscriptionstable. - To send a notification, your server drops a message at that address. The push service receives it and delivers it to the person's browser.
Your database row is just a piece of paper with an address written on it. That's why copying the address between websites doesn't create a new mailbox β only the person, by revisiting your site and clicking Allow, can create one.
20. Live vs dead subscribers#
A subscription becomes dead when the mailbox is destroyed: the user unsubscribed, cleared their browser data, their browser auto-expired the subscription, or the VAPID key changed so the push service no longer trusts your sender. When you try to send to a dead mailbox, the push service replies with an HTTP error and the subscription is auto-marked as expired in your database.
| HTTP code | What it means | Recovery |
|---|---|---|
| 200 / 201 | Delivered β the push reached the user's browser. | β |
| 410 Gone | The mailbox no longer exists. Permanent. | Auto-cleaned. Person must re-subscribe by revisiting your site. |
| 403 Forbidden | VAPID key mismatch β the subscription was created with a different key than the one signing this push. | Auto-cleaned. Recovers when the person revisits (browser re-subscribes with the current key). |
| 401 Unauthorized | JWT rejected (audience, signature, sub claim). | Rare. Often only affects Windows WNS subscribers, which use a different auth model that this software doesn't fully support. |
The push service doesn't tell you "this subscription is dead" until you actually try to send. So a fresh subscriber count is only ever approximately the number of live mailboxes. Every campaign you send refines the count β dead ones get moved to the Dead column automatically.
21. Health panel & cleanup#
Push admin β Subscribers tab β at the top is a π Subscriber Health panel showing three boxes per site:
- β
Live β subscriptions currently
status='active'. Will receive your next campaign. - β Dead β subscriptions a push service told us are gone (410/403). Will NOT be sent to.
- % still live β what share of all-time subscribers are still reachable.
Cleaning up dead rows
If dead rows are present, a π§Ή Clean up database section appears with two buttons:
- Delete N dead β this site β purges dead rows for the currently-selected site.
- Delete N dead β ALL sites β purges across every site you manage in one click.
The cleanup query is DELETE FROM subscriptions WHERE status <> 'active'. Live subscribers
are physically impossible to hit. Dead rows are useless anyway β the mailbox they point to is gone.
Recommended workflow
- Send a campaign first β this forces the system to detect any newly-dead subscriptions and mark them
expired. - Then hit Delete N dead β ALL sites to physically reclaim the space.
22. Pagination & country filter#
The Subscribers list paginates 100 rows per page (large totals get a sliding window pager: βΉ Prev 1 β¦ 2 3 4 β¦ 12 Next βΊ). All filters (country, search) survive page navigation; reloading directly to ?page=2 stays on the Subscribers tab automatically.
The Country dropdown uses a timezone-first detection that matches the table column's country, so a subscriber with locale=en-GB and tz=Asia/Kolkata appears under "India" in both the table and the filter.
23. Send a campaign#
- Push admin β Campaigns β Send Campaign.
- Fill in Title, Body, optional Icon URL / Image URL / Click URL.
- Choose target audience: All subscribers, a saved Segment, or specific countries.
- Click Send Now. The page reloads with a result summary.
If you have many subscribers, sending may take a minute. The system sets set_time_limit(0)
+ ignore_user_abort(true) so the send completes even if your browser tab times out. Refresh the page after a couple of minutes to see the final count.
24. Reading campaign results#
After sending, the result line looks like:
Campaign sent! 124 delivered, 18 expired (auto-cleaned), 2 failed.
- delivered β the push service accepted the push. The user will see the notification (if their browser is online; otherwise on next wake).
- expired (auto-cleaned) β 410 / 403 responses. These mailboxes were marked dead in the same operation; they won't be tried again.
- failed β temporary errors (e.g. 5xx). They stay active and can be retried.
Click View failure details to see the breakdown by HTTP status, by push provider (FCM / Mozilla / WNS), and a sample response body per code. See the table in Β§20 for what each status means.
25. A/B testing#
The A/B test sends Variant A to a random 50% of the selected audience and Variant B to the other 50%. Set both titles + bodies, click Run A/B Test. Results show side by side so you can compare delivered + clicks.
26. Managing 2+ sites on one license#
One installation, one license, many websites. When you create a new site, the admin copies the same master VAPID keypair from your oldest site. Whether you add a site on day 1, day 30, or day 365 makes no difference β it always inherits the master key.
- Sign in to the push admin.
- Use the Site dropdown in the top bar to switch between websites.
- The Subscribers, Campaigns, and Settings tabs are per-site. Each site has its own subscriber list and analytics.
- The Import/Export tab's VAPID key alignment table shows that every site is on the same key (β aligned). This is what makes cross-site transfer safe.
27. Transfer subscribers between sites#
The supported, safe way to move subscribers between your own sites:
- Push admin β Import/Export tab β π Transfer subscribers between your own sites card.
- The status table at the top confirms all sites share the same VAPID key (green banner = good to go).
- Pick From site (source) β To site (destination).
- Choose Move (recommended β no duplicates) or Copy (subscriber receives campaigns from both sites).
- Click π Transfer subscribers now.
- The result confirms "β Both sites share the same VAPID key, so these subscribers WILL receive campaigns from the destination site."
Cross-site transfer (between your own sites on this installation) is supported by design β all your sites use the same VAPID keypair, so any subscription works from any of them. Cross-domain transfer (importing from someone else's domain) is not, and never will be β see Β§28.
28. Why cross-domain imports don't work#
A push subscription is cryptographically locked to (a) the browser's view of which domain created it and (b) the VAPID key in use at that moment. Pasting endpoint URLs into the Import tab from someone else's domain just creates dead database rows: the next campaign hits 410/403, the rows get auto-cleaned, your real subscriber count is unchanged.
This is a Web Push security rule (otherwise anyone could steal a website's audience by exporting endpoints). No setting and no code change can override it.
They have to visit your site and click Allow again. Their browser then creates a fresh subscription bound to your domain + your VAPID key. Common ways to reach them: a banner/redirect from the original domain (if you still control it), an email campaign with a link to your new site, or paid retargeting.
29. Moving the push server to new hosting#
You can move the push server to a different host without losing subscribers, as long as you bring three things with you:
| What to move | How |
|---|---|
| The PHP files | FTP / scp the entire push-server directory to the new host, OR re-download a fresh ZIP from G9Push.com. |
| The database | mysqldump on the old host, import on the new host. This carries your subscribers, sites, VAPID keys, admin users, and campaign history. |
| The license | Generate a new installation token on G9Push.com (Installations β your install β "Generate install token"). Paste it during the new host's setup wizard. |
30. Step-by-step migration#
- On the OLD host: run
mysqldump -u USER -p DB_NAME > backup.sql. Downloadbackup.sql. - On the NEW host: create a new MySQL database. Import
backup.sqlinto it. - Upload the push-server PHP files to the new web root.
- Edit
api/config.phpon the new host with the new DB credentials. - On G9Push.com β Installations β click your install β click Generate install token. Copy the token.
- Open
https://new-domain.com/admin/setup.php. Step 2 β paste the install token β Activate Installation. - Step 3 β see Β§31 for what happens here.
- Update the DNS for your push subdomain to point at the new host.
- Test sending a campaign. The result should match what the old host had.
Because you migrated the database, the subscriptions table comes with you intact. As long as the same VAPID keys are in the new sites rows (they will be β you migrated those too), the push service still trusts your sender and delivers normally.
31. "An admin already exists for this installation"#
This message appears in Step 3 of the setup wizard on the new hosting after a migration, because the
admin_users table you brought with you already contains your original admin row. The wizard refuses
to silently overwrite it. Two paths from here:
If you remember the old password
- Go to
/admin/login.php. - Sign in with your existing admin email + password. Done.
If you forgot the old password
The setup wizard now lets you reset it directly (Step 3 changes to Reset your admin password):
- Re-open
/admin/setup.phpon the new host. - Step 3 form says "An admin account already exists in this database⦠If you forgot the password, enter the same email plus a new password."
- Enter your existing admin email (must match exactly, case-sensitive) + a new password.
- Click Reset password & continue. You're auto-signed-in and dropped on the admin dashboard.
The reset runs a single SQL: UPDATE admin_users SET password_hash = ... WHERE email = ?.
Only the admin row's password column changes. Subscribers, sites, campaigns, analytics β none of these tables are touched.
32. License-file troubleshooting#
If activation reports "License accepted by G9Push, but this server could not save the license cache", the file-system on your new hosting is blocking writes to all auto-detected paths. Force a specific writable path:
- SSH or FTP into the new hosting.
- Pick a directory you know is writable by PHP. The safest universal choice is the directory PHP uses for sessions; you can find it by visiting
/api/?path=phpinfoor by runningecho session_save_path();in any small PHP file. Common values:/tmp,/var/lib/php/sessions, your user's home directory. - Open
api/config.phpand add one line near the top:
define('G9PUSH_LICENSE_FILE', '/absolute/path/to/g9push-license.php');
- Save the file. Re-run
/admin/setup.phpand paste a new installation token. - The wizard now writes to your chosen path and proceeds to Step 3.
33. Common errors & fixes#
| Symptom | Most likely cause | Fix |
|---|---|---|
| "Email already registered" on signup | The email is in saas_users. Either you already have an account, or a prior account wasn't fully deleted. |
Sign in instead (forgot password works). If a SaaS admin truly hard-deleted the user, the email is then free for fresh signup. |
| SMS OTP never arrives | SMS provider credentials wrong, balance zero, or sender ID not approved for the recipient's country. | Admin β Settings β SMS provider. For MSG91, use the Test authkey now button to confirm the key is valid. |
| "Authentication Failure (http400)" on MSG91 verifyAccessToken | The Server authkey field has the wrong value (often the widget tokenAuth pasted by mistake). | Use the account-level Auth Key from MSG91 profile menu (~24 alphanumeric chars, no dots). Run Test authkey now. |
| Campaign result is "Unknown error" | send-campaign.php returned a non-JSON body (PHP fatal or 500). | Recent versions surface the real error. Check the PHP error log for the matching [g9push] line. Make sure the latest admin/index.php and api/send-campaign.php are uploaded. |
| Sent "X delivered, Y expired" where Y is large | Either the old subscribers pre-date a VAPID key change (recover by users revisiting), or they were imported from another domain (permanent β see Β§28). | The Y subscribers are now auto-cleaned. Run cleanup (Β§21) to physically reclaim the rows. |
Push server keeps redirecting to /admin/setup.php |
License cache file isn't on disk (write failed silently in an older version) OR no admin user exists. | Update to the latest api/license.php; re-run setup.php; if it errors, set G9PUSH_LICENSE_FILE explicitly. See Β§32. |
| HTTP 401 on a single Windows subscriber | WNS (legacy Windows / old Edge) uses a different auth model than VAPID. | Generally negligible (1β2 subscribers). The auto-clean handles it. |
| Service worker version mismatch in browser console | The SW is cached by the browser; a new version was deployed. | Bump the SDK version on the admin's site config; subscribers' browsers will re-fetch on next visit. |
34. Frequently asked questions#
Yes, by design. When you add a new site, the push admin copies the master VAPID keypair from your oldest site. To verify visually, go to push admin β Import/Export β the VAPID key alignment table β every row should show β aligned.
No. Timing doesn't matter. New sites always inherit the same master VAPID key, whether added on day 1 or day 365. They're fully compatible with subscribers collected on any of your other sites.
Those 67 subscriptions were no longer valid in the user's browser (mailbox destroyed β unsubscribed, browser cleared, key changed). The push service rejected them with HTTP 410/403. They've been auto-marked dead in your database and won't be tried again. To physically remove them, use the cleanup button (Β§21).
No. HTTP 410 is terminal β the mailbox is destroyed by the push service. The only way those people can receive notifications again is to revisit your site and click Allow, which makes their browser create a fresh subscription.
No, by design (Web Push security). A subscription is locked to the domain + VAPID key it was created on. Imported endpoints from another domain are dead on arrival β they fail with 410/403 and get auto-cleaned on the first campaign. The only way to reach those people is to get them to visit your site and re-subscribe.
Yes. The moment a campaign send detects a dead subscriber (410/403), the row's status is flipped to expired in the database. On the next dashboard page load, the Live count is already lower and the Dead count is already higher. No manual step required.
By default, just hidden (soft-deleted: status='expired'). They still take up disk space. Use the π§Ή Clean up database button on the Subscribers tab to physically remove them β that's a safe operation that only ever touches non-active rows.
Two separate accounts on two separate servers. G9Push.com is where you manage your license, billing, and downloads. Your push-server admin is on your own hosting (e.g. push.yoursite.com/admin/) and is where you actually send notifications and manage subscribers. They each have their own login.
As many as you want. One installation hosts unlimited sites underneath it. They all share the same VAPID key and subscribers can be freely transferred between them.
The first writable location from a list of candidates: above the web root (most secure), inside the install root, inside api/, PHP's session save path, or system temp. You can override with define('G9PUSH_LICENSE_FILE', '/absolute/path/license.php'); in api/config.php. See Β§14.
No. The only calls to G9Push.com are license validation (sends your license key + install domain + version) and an occasional heartbeat. Subscriber endpoints, push payloads, and analytics never leave your server.
That button instantly invalidates every subscriber on every site. There is no recovery β each person has to revisit your site and click Allow again to come back. (The button is now red, labelled "(DANGER)", and requires typing WIPE ALL SUBSCRIBERS to proceed, exactly to prevent this.) Going forward: never click it.
Your push server caches the last license-valid result for 6 hours, then enters a grace period of several days. During grace, everything keeps working normally. If grace runs out, the admin panel locks until G9Push.com is reachable again. Subscribers and analytics are preserved untouched.
35. Get help & report issues#
- Email support: support@g9push.com
- When asking for help, please include:
- The URL of the page where the issue appeared
- The exact error text (screenshot is fine)
- Whether this is on the G9Push.com side or your own push server
- Browser + OS for client-side issues
- For VAPID / OTP / license issues, the diagnostic panels in the relevant admin tab usually print exactly what's wrong (e.g. MSG91 code 418, the candidate path that failed to write). Paste that text into your support email.