Cloud Functions
Every Cloud Function Arc CMS deploys, grouped by area: what kind it is, who may call it or what starts it, and what it does. Use it to find the function behind a screen, or the one to deploy after a change.
How a function is named
functions/src/index.ts exports every function in one group, arccms. A function exported as sendTestEmail therefore deploys as arccms-sendTestEmail. The rule is arcFunctionName() in functions/src/function-names.ts, and the functions belong to the arccms codebase in firebase.json.
- The browser calls a function by its plain name through
arcCallable()insrc/app/core/config/arc-functions.ts, which adds the prefix. - An HTTP function is reached at its
arccms-name, for examplearccms-handleUnsubscribe. - An app's own functions in
functions/src/custom/deploy asarccms-custom-<name>and are not listed here. See Write your own Cloud Functions.
To deploy one function instead of all of them, see Deploy only what changed.
Which functions are deployed
Core functions are listed in functions/src/all.ts and always deploy. A switchable feature's functions are listed in functions/src/features/, one file per feature. Before every functions build, scripts/arc-features.mjs reads src/custom/features.ts and writes a generated list of the feature files whose features are on, which functions/src/all.ts exports.
- A full functions deploy with a feature off deletes that feature's functions.
functions/src/features/search+content.tsdeploys only when both search and content are on.- The
datafeature has no functions.
The feature ids are in Feature ids.
Who may call a function
Each callable checks its caller at the top of its handler. The tables below use these words:
| Word | Meaning |
|---|---|
| Admin | The caller's arccms_role claim is admin (functions/src/users/claims.ts). Some functions also read the claim from the account itself (functions/src/search/auth.ts), so a fresh claim works before the token refreshes. |
| Signed in | Any signed-in account, whatever its role. |
| Own record | Signed in, with a users record of their own (requireOwnRecord() in functions/src/auth/accounts.ts), and not a locked app account (App accounts). Only refreshMyClaims also takes a locked app account. |
| Public | No sign-in needed. Where a limit is given, it counts per caller (a hash of the IP address) or per address, in a fixed hour. |
Roles and claims are explained in Roles and claims.
Every Firestore trigger listens on the install's own database, ARC_DATABASE_ID (arcDocument() in functions/src/arc-config.ts). Every schedule runs in UTC.
A trigger's database is fixed when it is deployed: after changing the database, deploy the functions again (see Configuration keys).
Content
Owned by Content. Deployed only when the content feature is on.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
processPublishQueue | Firestore trigger: _publish_queue/{queueId} created | The admin app, on publish, unpublish, update, delete or a new entry order | Copies the draft to its published collection and releases the static pages to Firebase Hosting, with the home page when it shows that type's cards, and every page when a standard page's footer link changes; with seo on, also the sitemap, feeds and discoverability files, and tells IndexNow. |
onContentTypeDeleted | Firestore trigger: ContentTypes/{contentTypeId} deleted | Deleting a content type | Deletes the type's published, draft and Tags_{slug} collections, with each entry's translations, PublishedHistory and DeploymentLogs, and their search entries when search is on. Deletes nothing when another content type still uses the same slug. |
onSiteSettingsWritten | Firestore trigger: Settings/{settingId} written | An admin saving Settings, and the setup wizard | When about, site, localization or misc changed, queues a republish of the home page (a home item on _publish_queue), or of the whole site (redeploy-all) when About changed and other site files print it with data-arc-site. |
seedStaticPages | Callable | Intended for deploy tooling; npm run seed:dev and seed:prod run the same code directly | Publishes the home page in every language, every published content page and the static pages to Firebase Hosting as static HTML. |
Search
Owned by Search. Deployed only when the search feature is on; onSearchQueued also needs content.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
search | Callable | Public for the public scope; signed in for the authenticated scope; admin for the admin scope | Runs a search and returns the results. Every search box uses it. |
reindexSearch | Callable | Admin | Rebuilds the index for every source, one source or one collection. |
listSearchCollections | Callable | Admin | Lists the database's collections and their search setup, for Search settings. |
sampleCollectionFields | Callable | Admin | Samples up to 20 documents of a collection and returns their text fields, for setting it up. |
onSearchQueued | Firestore trigger: _search_queue/{id} written | The browser, on each draft save | Indexes the named draft, then deletes the queue entry. |
Search also deploys one trigger per collection made searchable in functions/src/custom/search-sources.ts, as the group searchSync: a collection Products deploys as arccms-searchSync-Products (functions/src/search/collectionTriggers.ts). Each keeps its collection's search entries in step with its documents.
SEO
Owned by SEO and discoverability. Deployed only when the seo feature is on.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
regenerateSeoFiles | Callable | Admin | Releases robots.txt, llms.txt and the IndexNow key file to Firebase Hosting right away. |
Signup forms
Owned by Signup forms. Deployed only when the forms feature is on (which needs audience). In the code a form is a Waitlists document and its members are Waitlists/{id}/users.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
ensureWaitlistExists | Callable | The public signup form | Creates the form document with defaults when no form has that id or slug. |
joinForm | Callable | Public | Finds or creates the member for an email and returns the member id. |
requestFormOtp | Callable | Public, one code a minute per form and address | Emails the form's verification code. |
verifyFormOtp | Callable | Public | Checks a form's code against its expiry and attempt limit. |
finalizeFormSignup | Callable | Public; needs a verified code when the form sends one | Completes the signup: marks the member verified and confirmed and updates the form's signup count. |
onWaitlistsCreate | Firestore trigger: Waitlists/{waitlistsId} created | A new form | Creates the form's audience list and its default code and welcome emails. |
onWaitlistsUpdate | Firestore trigger: Waitlists/{waitlistsId} updated | A form change | Renames the form's audience list when the form's name changes. |
onWaitlistsDelete | Firestore trigger: Waitlists/{WaitlistsId} deleted | Deleting a form | Deletes the form's subcollections and its audience list. |
onWaitlistUserCreate | Firestore trigger: Waitlists/{WaitlistsId}/users/{usersId} created | A new member | Sends the welcome email to a member who joined directly and is already verified. |
onWaitlistUserUpdate | Firestore trigger: Waitlists/{WaitlistsId}/users/{usersId} updated | A member change | Sends the welcome email when the member's email becomes verified, unless a sequence sends it. |
syncOtpEnabledFlag | Firestore trigger: EmailTemplate/{templateId} written | A template change | Copies whether a form's code email is active to the form's otpEnabled. |
getWaitlistTemplateDefaults | Callable | Admin | Returns the default code and welcome emails, without writing. |
backfillWaitlistTemplates | Callable | Admin | Creates missing default emails for existing forms, and gives a welcome that is still the old default with referral and leaderboard buttons the plain one. dryRun only reports the missing emails. |
normalizeWaitlistTemplateIds | Callable | Admin | Merges duplicate form emails onto one document per form and type. dryRun only reports. |
stampFormTargetLists | Callable | Admin | Sets targetListIds on existing forms that lack it. dryRun only reports. |
Signup forms have no referrals or leaderboard, so these functions of older versions are gone: creditReferral, getPublicLeaderboard, getPublicMemberView, getOptimizedLeaderboard, migrateWaitlistedUsers, onReferralCreate, onReferralUpdate and onWaitlistUserDelete. A deploy of all the functions deletes them from a project that still has them (see Functions that are deleted).
Audience
Owned by Audience. Deployed only when the audience feature is on. Contacts are written only by functions, so every admin change to a contact goes through a callable.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
onUserCreateContact | Firestore trigger: users/{docId} created | A new user | Creates or updates the person's contact and adds it to the all-users list. |
onUserDeleteContact | Firestore trigger: users/{docId} deleted | Deleting a user | Unlinks the contact from the user and drops it from the system lists. |
onWaitlistUserCreateContact | Firestore trigger: Waitlists/{waitlistId}/users/{userId} created | A form signup | Creates the member's contact, usually as pending, and adds it to the form's lists. |
onWaitlistVerifiedContact | Firestore trigger: Waitlists/{waitlistId}/users/{userId} updated | A member verifying or being confirmed | Makes the pending contact subscribed. |
onWaitlistUserDeleted | Firestore trigger: Waitlists/{waitlistId}/users/{userId} deleted | Deleting a member | Removes the contact from the form's own list. The contact itself stays. |
onContactTagDelete | Firestore trigger: ContactTags/{tagId} deleted | Deleting a tag | Removes the tag from every contact. |
adminAddContact | Callable | Admin | Adds or updates one contact and its lists. |
adminUpdateContactLists | Callable | Admin | Adds a contact to lists or removes it from them. |
adminSetContactConsent | Callable | Admin | Sets a contact's marketing consent and keeps the Suppression list in step. |
adminSetContactDisabled | Callable | Admin | Turns every email to a contact off, or back on. |
adminDeleteContact | Callable | Admin, with confirm: true | Erases a contact everywhere and keeps a record with only its hash in ErasureLog. |
adminSetContactTags | Callable | Admin | Sets a contact's tags. |
adminUpsertContactField | Callable | Admin | Creates or updates a custom contact field. |
adminDeleteContactField | Callable | Admin | Deletes a field definition. Values on contacts stay. |
adminSetContactFields | Callable | Admin | Sets field values on one contact. |
previewContactImport | Callable | Admin | Parses a CSV and returns its valid, invalid and duplicate rows, without writing. |
importContacts | Callable | Admin | Imports parsed rows into a list, as subscribed only when the admin confirms consent. |
backfillContacts | Callable | Admin | Builds contacts from existing users and verified form members. dryRun only reports. |
backfillPendingContacts | Callable | Admin | Gives unverified form signups a pending contact. dryRun only reports. |
backfillFormLists | Callable | Admin | Creates or repairs each form's audience list. dryRun only reports. |
migrateTagsToContacts | Callable | Admin | Copies per-form member tags onto contacts as shared tags. dryRun only reports. |
migrateFormDataToContactFields | Callable | Admin | Copies stored form answers onto contact fields through each form's field map. dryRun only reports. |
App audience
Owned by App audience, part of the audience feature and deployed with it. The host app's users are where ARC_APP_USERS_PATH and ARC_APP_USERS_DATABASE point (functions/src/app-audience/config.ts).
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
appAudienceStatus | Callable | Admin | Returns where the host app's users are and the saved App audience settings. |
sampleAppUsers | Callable | Admin | Lists the fields found in a sample of host user documents. |
testAppUser | Callable | Admin | Reads one host user with the given settings, before they are saved. |
listAppUsers | Callable | Admin | Lists the app users, with an optional search. |
getAppUser | Callable | Admin | Returns one app user's fields, state and recent events. |
previewAppList | Callable | Admin | Returns who a live App users list matches now: counts and the first 200. |
onAppUserWritten | Firestore trigger: the host app's user documents, written; retried | The host app changing a user | Emits app events and joins or leaves sequences as the user changes. It does nothing until the path is set. |
Email engine
Owned by Email engine. Always deployed.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
onEmailLogCreate | Firestore trigger: EmailLogs/{EmailLogsId} created | Every queued email | Sends a pending email through the active mail provider. A sendNow email, such as a sign-up code, is sent by the call that queued it, and this sends it only if that call did not. |
retryPendingEmails | Scheduled: every 5 minutes | The schedule | Sends again the emails in retrying or deferred whose next attempt is due. |
handleUnsubscribe | HTTP, GET and POST | Public, with a signed link | Unsubscribes the recipient. GET shows a page; POST is one-click unsubscribe. |
handleEmailPreferences | HTTP | Public, with a signed link | Shows the recipient's preferences page and subscribes or unsubscribes them. |
unsubscribeLegacyLink | Callable | The unsubscribe page, for an older link | Unsubscribes the recipient of an older unsubscribe link, one that carries a member id instead of a signed token. |
handleEmailWebhook | HTTP | The mail provider | Records sent, delivered, bounce, complaint and reject events on the email log. |
trackEmailOpen | HTTP | An email client loading the tracking pixel | Records an open and returns a 1x1 GIF. |
sendTestEmail | Callable | Admin | Sends composed content as a test email. |
seedEmailTemplates | Callable | Admin | Creates missing default templates, notification types and event mappings, and the system lists when audience is on. |
dedupeEmailTemplates | Callable | Admin | Deletes duplicate templates of the same type and form. |
purgeEmailLogs | Callable | Admin | Deletes email logs older than a number of days (60 by default). |
scheduledPurgeEmailLogs | Scheduled: every day 02:00 UTC | The schedule | Deletes email logs older than the retention in the email settings (60 days by default). |
testProviderConnection | Callable | The Email settings page | Tests a mail provider configuration. |
testSmtpConfigConnection | Callable | The Email settings page | Tests a mail provider configuration and sends a test email with it. |
Email marketing
Owned by Email marketing. Deployed only when the email-marketing feature is on (which needs audience).
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
processBroadcast | Firestore trigger: BroadcastEmails/{broadcastId} created | A new broadcast | Queues one email per recipient of a queued broadcast. |
continueBroadcast | Firestore trigger: _broadcast_continue/{docId} created | A broadcast that ran out of time, or a scheduled one starting | Resumes the broadcast where it stopped. |
processScheduledBroadcasts | Scheduled: every 5 minutes | The schedule | Starts scheduled broadcasts that are due, and marks those more than a day late as failed. |
previewBroadcastAudience | Callable | Admin | Counts who a broadcast would reach, respecting consent. |
processDripQueue | Scheduled: every 15 minutes | The schedule | Sends the due step of each active sequence enrollment. |
activateDripCampaign | Callable | Admin | Activates a sequence, and enrolls the list's current members when it is set to. |
archiveDripCampaign | Callable | Admin | Archives a sequence and ends its enrollments. |
migrateWelcomeToSequences | Callable | Admin | Turns each form's welcome email into the first step of a sequence. dryRun only reports. |
sendAnnouncement | Callable | Admin | Sends an announcement to an audience as in-app notifications, and by email when asked. |
Automations
Owned by Automations. Always deployed.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
onAppEventCreate | Firestore trigger: AppEvents/{id} created | Any code that emits an app event | Runs the event's mapping from Settings/event_mappings: a notification, an email or a list change. |
Notifications
Owned by Notifications. Always deployed.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
onNotificationCreate | Firestore trigger: Notifications/{id} created | A new notification | Decides whether the notification is also emailed, and records why when it is not. |
sendAdminDigest | Scheduled: every hour | The schedule; sends only in the configured hour | Emails every admin a 24-hour summary when the digest is on. |
getMyNotificationPrefs | Callable | Signed in | Returns the notification types a person can choose and their email choices. |
updateMyNotificationPrefs | Callable | Signed in | Saves the person's email choice for each notification type. |
Sign-in
Owned by Sign-in methods. Email and Google sign-in, and adding an email or number to an account, are always deployed.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
checkEmailAccount | Callable | Public, 100 an hour per caller | Says whether an email is registered, new, an unfinished sign-up, or has no access. |
requestSignupOtp | Callable | Public, 20 an hour per caller and 5 an hour per address | Emails a sign-up code. With the Debug Provider the reply also carries the code, for the sign-up page to show. Asked again inside the minute, it sends nothing and answers alreadySent with the seconds left. |
verifySignupOtp | Callable | Public; own record for a link code | Checks a sign-up, reset or link code and returns a ticket. |
createAccountRecord | Callable | Signed in with email and password | Creates the person's users record with the default role and sets the claims. Refuses a locked app account a password was linked to, and takes the password off it. |
requestPasswordReset | Callable | Public, 20 an hour per caller and 5 an hour per address | Forgot password: emails a reset code to an account this site may reset. sent: false when the email engine sent nothing, and the page has Firebase email its reset link. With the Debug Provider the reply carries the code only when Show password reset codes on screen is on. |
resetPassword | Callable | Public, with the ticket from a checked reset code | Checks the new password against the password rule, sets it, uses the code up and signs out every other session. |
ensureGoogleAccount | Callable | Signed in with Google | Creates a users record for a new Google sign-in, when Google sign-in and sign-ups are on. Refuses a locked app account Google was linked to, takes Google off it and ends its sessions. |
checkIdentifierForLink | Callable | Own record | Says whether an email or number is free, already theirs, or on another account. |
requestEmailLinkOtp | Callable | Own record, 10 an hour | Emails a code to an address being added. |
linkEmail | Callable | Own record | Adds the verified address to the account, moving it from another account if needed. A first password must meet the password rule (reason weak-password). |
linkPhone | Callable | Own record; phone sign-in on | Adds the verified number to the account, moving it from another account if needed. |
Phone sign-in
Phone sign-in cannot work without an SMS provider, so these belong to the SMS feature and deploy only when sms is on. Each also refuses to run unless phone sign-in is turned on in the sign-in settings.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
checkPhoneAccount | Callable | Public, 100 an hour per caller | Says whether a number has an account and a PIN. |
requestPhoneOtp | Callable | Public, 20 an hour per caller; own record to add a number | Texts a code for sign-up, a PIN reset, or adding the number to an account. Asked again for the same purpose inside the minute, it sends nothing and answers alreadySent with the seconds left; a code for another purpose goes at once. |
verifyPhoneOtp | Callable | Public; own record for a link code | Checks a text code and returns a ticket. |
completePhoneSignup | Callable | Public, with a verified ticket | Creates the sign-in account and users record for a number, with its PIN. |
signInWithPin | Callable | Public, 30 an hour per caller | Checks the PIN and returns a sign-in token. |
resetPin | Callable | Public, with a verified ticket | Sets a new PIN, signs out every other session and returns a sign-in token. |
setPin | Callable | Own record with a phone number | Sets the account's PIN. |
SMS
Owned by SMS. Deployed only when the sms feature is on.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
sendTestSms | Callable | Admin | Texts a test code to a number through the configured provider. |
checkPhoneSignIn | Callable | Admin | Signs a throwaway sign-in token to check that phone sign-in can sign people in, and returns the fix for this project when it cannot. |
Users and roles
Owned by Users and roles. Always deployed. What deleting an account removes is set out in Follow the account contract.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
onUserCreated | Firestore trigger: users/{docId} created | A new user | Adds the hashed email to email_lookup, emits user.signed_up and tells the admins. |
onUserCreateWelcomeEmail | Firestore trigger: users/{docId} created | A new user with an email | Queues the sign-up welcome email. |
onUserRoleChange | Firestore trigger: users/{docId} written | A user record created or changed | Sets the arccms_role and arccms_uid claims from the record. A blocked or detached record loses them and its sessions end. |
onUserDeleted | Firestore trigger: users/{docId} deleted; retried for up to an hour | Deleting a user | Ends access, deletes the sign-in (unless another app owns it), the lookups, PIN, app PINs and phone PIN gate counts, subcollections, Storage folders, feedback and notifications, then emits user.deleted. |
onSignInDeleted | Auth trigger (first generation): a sign-in account deleted | A sign-in deleted outside Arc CMS, such as by the person's browser | When a users record still points at the sign-in, keeps it and emits user.signInDeleted. Arc CMS's own deletions remove the record first, so they emit nothing. |
claimFirstAdmin | Callable | Signed in with a users record that is not a locked app account, only while no admin has ever existed | Makes the caller the site's first admin. Called again by that admin, it restores the role if it was lost before setup finished. |
syncAllUserRoles | Callable | Admin, by the role on their users record | Applies every user's claims again from their records. |
fillAccountSources | Callable | Admin, by the claim | Gives every users record with no by the value unknown, so the users list's People filter finds it. Called by the users page itself, once, when its counts show such records. |
adminCreateUser | Callable | Admin | Creates a sign-in account and users record with a role, or reuses an existing sign-in. A new account's temporary password must meet the password rule. |
adminSetPassword | Callable | Admin | Sets a person's password on their sign-in account, never in Firestore, after the password rule (refused with the reason weak-password and the problem). Refuses a sign-in another app owns or shares (shared-account), a locked app account (app-managed), an account with no email (no-email) and a record whose sign-in account is missing (no-account). |
refreshMyClaims | Callable | Signed in with a users record, a locked app account too | Applies the caller's claims again. A blocked account loses them instead. A locked app account signed in without the app's token is refused, loses that way in and is signed out everywhere. |
deleteMyAccount | Callable | Own record, signed in within the last 10 minutes, not an admin, not a locked app account | Erases the person's contact and deletes their record; onUserDeleted does the rest. |
Payments
Owned by Payments. Deployed only when the payments feature is on. The provider is Dodo Payments.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
createCheckoutSession | Callable | Signed in | Creates a checkout for a product at its current price tier and returns the checkout URL. |
createTestCheckoutLink | Callable | Admin | Creates a test checkout URL for one tier's discount code. |
dodoWebhook | HTTP | Dodo Payments, with a verified webhook signature | Saves the raw event to WebhookEvents, once per webhook id. |
handlePaymentEvent | Firestore trigger: WebhookEvents/{eventId} created; retried | A saved webhook event | Updates the transaction, the purchase count and the user's entitlement, and sends the payment email. |
testDodoConnection | Callable | Admin | Checks that the stored Dodo Payments keys work. |
consumeCredits | Callable | Signed in | Spends the caller's prepaid credits and records it in CreditLedger. |
Entitlement reminders and expiry
Part of the payments feature and deployed with it. See Premium entitlements.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
scanExpiredEntitlements | Scheduled: every day 08:00 UTC | The schedule | Ends subscriptions past their expiry plus a grace period, in case a webhook was missed. |
scanTrialEndings | Scheduled: every day 09:00 UTC | The schedule | Emails, once, each user whose trial ends soon. |
scanUpdatesEnding | Scheduled: every day 09:30 UTC | The schedule | Emails, once, each user whose free updates end soon. |
Feedback
Owned by Feedback button. Always deployed.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
onFeedbackCreated | Firestore trigger: Feedback/{id} created | A person sending feedback | Adds the sender's name, email and phone from their record, and notifies the admins, up to 10 alerts an hour per sender. |
Contact form
Owned by Contact form. Deployed with the contact feature.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
submitContactMessage | Callable, public | A contact form on a published page (arc-site.js) | Checks the message (honeypot, time on the page, five an hour per sender address and per email, field lengths) and stores it in ContactMessages; one with many links is kept as possible spam. |
onContactMessageCreated | Firestore trigger: ContactMessages/{id} created | A stored contact message | Notifies the admins (admin_contact_message), up to 10 alerts an hour; possible spam raises none. |
Analytics
Owned by Analytics. Deployed only when the analytics feature is on.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
connectGoogleAnalytics | Callable | Admin | Exchanges a Google authorization code and saves the connection. |
selectAnalyticsProperty | Callable | Admin | Saves the chosen Google Analytics property. |
refreshAnalyticsData | Callable | Admin | Fetches fresh data from Google Analytics and stores it. |
disconnectGoogleAnalytics | Callable | Admin | Revokes the Google token and removes the connection. |
testAnalyticsConnection | Callable | Not used by the admin screens | Checks the service account settings and returns the property's details. |
Media
Owned by Media. Always deployed.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
searchUnsplash | Callable | The media manager, signed in | Searches Unsplash images with the key kept on the server. |
readMediaImage | Callable | The media manager's Save cropped copy, admins only | Returns an upload's XL file as bytes, so the browser can crop it whatever the bucket's CORS setup. |
readMediaFile | Callable | The media manager's Take an image on a library PDF, admins only | Returns the PDF in 6 MB parts (base64, with the offset and total), so the browser can draw its pages whatever the bucket's CORS setup. PDFs up to 20 MB, from the mediaFiles document only. |
Installable app
Owned by Installable app (PWA). Deployed only when the pwa feature is on, which it is not by default.
| Function | Kind | Who or what starts it | What it does |
|---|---|---|---|
trackPwaEvent | Callable | Public, 30 an hour per caller | Counts an install prompt, install, dismissal or installed open per day and platform, and marks a signed-in person's record as installed. |