UUruvakDocs
PricingOpen dashboard
Grow 12 min

Push notifications

Set up your own free Firebase project, take the release that lets phones register, then send order updates and promo pushes from Settings › Notifications.

When you finish this page
Push notifications working on real Android phones: order-status updates going out on their own, and a promo push you can write and send in about a minute.

Push runs on your own free Firebase project, not on Uruvak's. You create that project once, upload two files from it, and Uruvak sends on your behalf from then on. Everything lives in one place — your store, then Settings › Notifications. Setting up Firebase takes about five minutes. Getting the first push onto a real phone takes longer, because it needs a new release and a Google Play review.

Before you go on

Push is Android-only today. On Settings › Releases the iOS button is permanently disabled and reads iOS — soon, so there is no iPhone app to receive anything. The composer's own helper line ends with "Reaches both iOS and Android" — that sentence is wrong today. Ignore it.

Before you start#

Three things have to be true first, and one of them cannot be changed later.

Your store must be connected. Order updates arrive from your WooCommerce site, and the Category, Product and Gallery pickers in the composer read your live catalog and media. With no connection, order pushes are refused before they reach you and the pickers show "No categories found. Connect your store to load its catalog." See connect your store.

Your package name must be the one you intend to keep. Firebase is tied to it, and so is your app in Google Play.

Can't be undone

The package name on Settings › General is editable only until your first release. After that the field turns read-only and reads "Locked — a build has been taken, so the package name is now permanent (apps are tied to it forever in the Play Store / App Store)." Register your Firebase Android app against that final name. If you rename the package first and upload afterwards, fine — but never the other way round.

You must be able to take a release. Uploading the files is not enough on its own; see Take a new release below.

Set up Firebase#

Open your store, click Settings in the top bar, then 🔔 Notifications in the left column. Until both files are uploaded, this whole area is one dashed card with six numbered steps. There is no switch, no composer and no history on the page yet — they appear underneath only when both uploads are done.

app.uruvak.com/apps/nordvik/settings?section=notifications
Settings › Notifications before setup. The six steps are the whole feature at this point — everything else is hidden until both files are in.
Settings › Notifications before setup. The six steps are the whole feature at this point — everything else is hidden until both files are in.
  1. Open the Firebase console

    Step 1 of the card links to console.firebase.google.com. Sign in with any Google account — it does not have to be the address you use for Uruvak, and Firebase costs nothing for this. Keep the Uruvak tab open in another window; you will copy two values out of it.

  2. Create a project

    Click Create a project, or open one you already have. Any name works — your store's name is fine. When Firebase offers Google Analytics, turn it off: Uruvak does not use it and it adds two more screens. Wait for the project to finish being created, then continue into it.

  3. Add an Android app with your exact package name

    On the project's home screen click the Android icon, or Add app → Android.

    In the field marked "Android package name", paste the package name from the first chip in the Uruvak card. Press Copy there — it flips to "✓ Copied" for a second and a half — then paste. Do not type it by hand. One wrong character and the upload in step 5 is refused with "This file has no client for this app's package name (com.uruvak.yourstore) — it covers …".

    An app nickname is optional. Leave it or name it after your store.

  4. Paste the signing fingerprint, then register the app

    The second chip in the Uruvak card is a fingerprint. Copy it into "Debug signing certificate SHA-1", just below the package name field.

    Push works without it. Sign in with Google inside your app does not. If you skip it, the Firebase row in Uruvak will later show a hint telling you to add the fingerprint in Firebase, re-download the file and press Replace — so it is much less work to paste it now. See Google sign-in for shoppers.

    Then click Register app.

    Note

    Every Android release Uruvak builds today is signed with one shared key, so that fingerprint is the same for every merchant. If Uruvak moves to per-app signing keys, you will need to add the new fingerprint in Firebase and re-upload google-services.json. Nothing about push breaks when that happens — only Google sign-in.

  5. Download google-services.json and upload it to Uruvak

    Firebase now offers Download google-services.json. Download it, go back to the Uruvak tab and press Upload google-services.json, then pick that file.

    Then stop. As the card says: "Skip the remaining Firebase steps ("Next… Continue to console")." Those remaining screens are instructions for a developer adding Firebase to source code. Uruvak does that part for you.

    Three things are checked before the file is accepted: it has to be under 20,000 bytes, it has to actually be a google-services.json with Android entries in it, and one of those entries has to be your exact package name. When it lands, the button becomes "✓ google-services.json uploaded" with a small Replace link next to it.

  6. Generate a service-account key and upload that too

    Back in Firebase, open ⚙ Project settings → Service accounts and click Generate new private key. Confirm, and a second .json file downloads. Upload it in Uruvak with Upload service-account key.

    This second file must come from the same Firebase project as the first one. If it does not, Uruvak refuses it: "This key belongs to Firebase project "a", but your google-services.json is from "b". Generate the key in that same project (Project settings → Service accounts)."

    The card explains where this one lives: "This key lets Uruvak deliver notifications on your behalf. It stays on our servers and is never shipped inside your app or shown again after upload." Treat the downloaded copy like a password — delete it from your Downloads folder once it is uploaded. You can always generate a fresh one in Firebase.

Tip

Upload google-services.json first, then the key. Uruvak checks the key against the project named in google-services.json — and only in that order. Do it the other way round and that check never runs, so two files from two different Firebase projects will both be accepted and every send afterwards will fail.

When both files are stored, the dashed card disappears and two status rows take its place.

Notifications
Reach your customers with push notifications.
Firebase configuration✓ uploaded
google-services.json · project nordvik-supply · Google Sign-In ready · applies from your next Android build
ReplaceRemove
Service-account key✓ uploaded
firebase-adminsdk@nordvik-supply.iam.gserviceaccount.com · used by Uruvak to deliver your notifications
ReplaceRemove
A finished setup. Each row can be replaced or removed; removing either one hides the composer again.

Each row has Replace and a small Remove. Removing either file puts the six-step card straight back and hides the switch, the composer and the history until you upload again — and the next release you take will ship with no push at all. Removing the service-account key cannot be undone from here, because the key is never shown again; you would generate a new one in Firebase.

Note

The setup card can also reappear for a much duller reason: a hiccup while the page checks whether your key is stored. Reload the page before you re-upload anything. If the section just sits on "Loading…" and never resolves, that is the same problem — reload.

Take a new release, or nothing will happen#

This is the step people miss, and missing it is the number one reason push silently does nothing.

google-services.json is baked inside your app when the app is built. A phone can only sign up to receive your notifications if the copy of your app it is running already contains that file. Uploading the file to Uruvak does not reach a single phone that already has your app installed.

  1. Open Settings › Releases

    The sidebar item is called ▤ Releases. (The setup card's own closing line says "Settings → Builds" — same place, older wording.) Press Release Android app (APK) and confirm. If that button is greyed out with "Nothing changed that needs a release. Publish live instead — it's instant.", your google-services.json did not actually save to this app — go back and check the Notifications section.

  2. Wait about ten minutes

    "A release takes ~10 min to build. It runs in the background — you can keep working." The row's badge moves from Queued to Building to Ready, and then a ⬇ Download button appears.

  3. Upload the APK to Google Play yourself

    Uruvak does not submit anything to any app store. You download the APK and upload it to your own Google Play account. Google's review usually takes one to two days. The full walkthrough is in get your app onto Google Play.

  4. Install that build and open it once

    Registration happens the first time the new build is opened, after the phone's own permission prompt is accepted. A shopper who never updates the app stays unreachable.

Before you go on

Until people are running a build that contains your google-services.json, every send reports "Sent — but no devices are registered yet. Notifications reach devices once the app (with push support) is installed and opened." and logs a row with 0 delivered. Nothing is broken. There is simply nobody to deliver to yet.

If this is also your first ever release, it unlocks Publish live at the same time.

Turn on order updates#

Under Automatic notifications there is exactly one row: Order updates, described as "Automatically notify a customer when their order is confirmed, shipped, or delivered." It is off for every new app. Switch it on — it saves by itself, and if the save fails the switch flips back and a red line appears underneath.

Who actually receives these matters more than the switch does. Order updates only reach a shopper who was signed in to your app when the order was placed. Guest checkouts are dropped in WordPress before they ever reach Uruvak, and an order with no signed-in customer is skipped again on Uruvak's side. Someone who bought from your website in a browser, or who never signed into the app, gets nothing.

Here is the exact wording a shopper sees, for order 1042:

WooCommerce statusTitleMessage
processingPayment confirmed 🎉Order #1042 is confirmed and being prepared.
on-holdOrder on holdOrder #1042 is on hold — we'll update you soon.
completedOrder complete ✅Order #1042 is complete. Thanks for shopping with us!
cancelledOrder cancelledOrder #1042 has been cancelled.
refundedRefund issuedOrder #1042 has been refunded.
failedPayment failedPayment for order #1042 didn't go through.
shippedYour order shipped 🚚Order #1042 is on its way!
deliveredOrder delivered 📦Order #1042 has been delivered. Enjoy!
anything elseOrder updateOrder #1042 is now awaiting pickup.

You cannot edit this wording. Tapping any of them opens the orders screen inside your app.

Note

shipped and delivered are not standard WooCommerce statuses. They only ever fire if a shipment plugin sets exactly those two status names on the order. Without such a plugin, your shoppers go straight from "Payment confirmed" to "Order complete".

Four statuses never notify, whatever the switch says: pending, checkout-draft, auto-draft and trash. Those are half-finished and binned orders, and a customer should not hear about them. Every other status does notify — including custom ones from your own plugins, using that last generic line. If your shop uses a status named awaiting_pickup, your customer gets "Order #1042 is now awaiting pickup."

Note

Automatic order pushes are not recorded anywhere you can see. Recent sends lists your promo pushes only. There is no log, no counter and no delivery report for order updates — the only way to confirm they work is to place a test order on a signed-in account and watch the phone.

Send a promo push#

Send a push
Title31/120
20% off everything this weekend
Message46/500
Ends Sunday at midnight. Tap to shop the sale.
Image (optional)
https://…/banner.jpg
Gallery
Opens on tap (optional)
NoneHomeCategoryProductCustom URL
The image shows as a large banner on Android. Home, category and product open inside the app; a custom URL opens the browser. Reaches both iOS and Android.
Preview
N
20% off everything this weekendnow
Ends Sunday at midnight. Tap to shop the sale.
Send notification
The composer. The preview on the right updates as you type, and is the only preview you get.
  1. Write it

    Title holds up to 120 characters and Message up to 500, with a live counter on each. Both are hard limits. Lock screens truncate long text long before those numbers, so watch the preview rather than the counter.

  2. Add an image, if you want one

    Paste a URL into Image (optional), or press Gallery to pick one from your store's WordPress media library ("Choose an image · store media"). The image appears as a large banner under the text on Android. Two things to know: an address that is not a proper web address is only rejected at the moment you press send, and an address that is real but points at nothing is never flagged at all — the image simply vanishes from the preview and from the notification.

  3. Choose what tapping it opens

    Opens on tap (optional) gives you five chips: None, Home, Category, Product and Custom URL. Home, Category and Product open that screen inside your app. A custom URL opens the phone's browser instead, which takes the shopper out of the app — use it sparingly. Category and Product load your connected store's live catalog, with a search box.

  4. Send it

    Send notification stays greyed out until the title is filled, the message is filled, and the destination is complete — meaning you actually picked a category or product, or typed a URL starting with http:// or https://. Nothing on screen explains this. If the button looks broken, that is why.

The result appears next to the button: "Delivered to 412 devices." — with "· 4 failed" added when some did not go through. Failed usually just means people who uninstalled your app; those devices are dropped automatically, so your delivered number drifts down over time on its own.

Can't be undone

A push cannot be recalled, edited or deleted once sent. There is no scheduling, no test send, no sending to yourself first, and no way to reach only some customers — every send goes to every phone with your app on it, immediately. Read the preview twice before you press the button.

Recent sends#

Recent sends
Notification
When
Delivered
Failed
20% off everything this weekendEnds Sunday at midnight. Tap to shop the sale.In-app · Home
just now
412
—
New in: Cedar ToteJust landed — $48.00, limited run.In-app · Product: Cedar Tote
14m ago
408
4
Free shipping all weekNo minimum. Ends Friday.In-app · Category: Bags
3h ago
396
11
Hello from the new appTesting our first notification.
2 Sep 2026
0
—
The last 50 promo sends. Delivered and Failed are counted at the moment you sent — they are not opens.

The table keeps your last 50 promo sends, newest first, with the time shown as "just now", "14m ago", "3h ago" and then a plain date.

Read Delivered carefully. It is the number of devices Google accepted the message for at the moment you pressed send — not the number of people who saw it, and not opens. Failed shows an em dash rather than a zero when nothing failed.

A send that reached nobody still gets a row, showing 0. Rows cannot be deleted or cleared, so early test sends stay in the list.

For anything about how people respond, go to the store's Analytics tab, where a Push notifications panel shows Prompted, Granted, Opt-in rate and Opened for the period. Those numbers come from the app itself and cannot be traced back to one particular send. See analytics.

What push cannot do yet#

This is worth reading before you plan a season around it.

What you might expectToday
Schedule a push for laterNot built. The composer sends the instant you press the button.
Campaigns, sequences, automationsNot built. The one automation that exists is the Order updates switch.
Abandoned-cart, back-in-stock or price-drop pushesNot built, despite being mentioned on our own pricing page.
Send to a segment, or to one customerNot built. Every promo push goes to every device.
Send a test to your own phone firstNot built. Install your own app and use the on-screen preview.
iPhone notificationsNot possible — there is no iOS app to build yet.
See who opened which pushNot built. Analytics shows opens in total only.
Delete a row from Recent sendsNot built.
Note

Where those gaps hurt most, the honest workarounds are small ones. For a timed sale, set a reminder and press Send notification yourself at the hour. For anything resembling a segment, use email for the segment and push for the announcement everyone should get.

Push itself is not part of your plan. Both uploads, the order-updates switch and the composer work on free, and no limit is applied to how many you send — if you have seen "Order-status push (capped)" in the Free plan's feature list, no such cap exists in the product. What your plan does limit is how often you can publish design changes; see plans and limits.

When push does nothing#

"Sent — but no devices are registered yet." No phone is running a build that contains your google-services.json. Take a release, get it through Google Play, and install that build. This is by far the most common cause.

"Delivered to 0 devices · 214 failed" — devices exist, but Uruvak could not deliver to them. Check that the Service-account key row still says "✓ uploaded". If you removed it, or replaced it with a key from a different Firebase project, every send fails. Upload a key generated in the same project as your google-services.json.

A red line reading "This file doesn't cover the current package name (…) — builds will skip push until you upload a matching one." Your package name changed after you uploaded. Add an Android app with the new package name in Firebase, download google-services.json again, press Replace, and take a new release.

The six-step setup card came back on its own. Either a file really was removed, or the page failed to check the key. Reload first. If the card is still there, re-upload the missing file — then take a release before expecting anything to send.

Send notification will not light up. One of three things is empty: the title, the message, or the destination. Picking the Category or Product chip without then choosing one from the list counts as incomplete, and so does a custom URL that does not start with http:// or https://.

Order updates are on, but customers get nothing. Work down this list: the order was a guest checkout; the customer was not signed in to the app when they ordered; the customer never installed or opened a build with push in it; the status that changed was pending, checkout-draft, auto-draft or trash; the store is disconnected. One more, rare but real: if your WordPress server's clock is more than five minutes out, Uruvak rejects the order events and nothing is logged anywhere. Ask your host to check the server time. See when the connection breaks.

The Notifications section is stuck on "Loading…". The page could not fetch your app's settings and shows no error. Reload. If it persists, check the store's connection.

Once push is working, the same Firebase project you just created is also what powers Google sign-in for shoppers — if you pasted the SHA-1 fingerprint, most of that page is already done.