Welcome to the Jose Madrid Salsa developer docs — explore features, APIs, and deployment guides.
Jose Madrid SalsaJMS Docs

Environment Variables

Complete reference of all environment variables used by Jose Madrid Salsa

Environment Variables

Jose Madrid Salsa uses environment variables for all secrets, API keys, and runtime configuration. Variables prefixed with NEXT_PUBLIC_ are exposed to the browser; all others are server-only.

Never commit .env files to version control. Use .env.example as a reference template and configure real values in Vercel or your local .env.local file.

Database

VariableRequiredDescription
DATABASE_URLYesPrimary PostgreSQL connection string (pooled). Falls back to PRISMA_DATABASE_URL then POSTGRES_URL if unset.
POSTGRES_PRISMA_URLNoSet by the Vercel Postgres integration. lib/prisma.ts sanitizes it alongside POSTGRES_URL.
DATABASE_URL_UNPOOLEDRecommendedDirect (non-pooled) connection for migrations. Used by Prisma directUrl.
PRISMA_DATABASE_URLNoAlias fallback for DATABASE_URL.
POSTGRES_URLNoSecond fallback for DATABASE_URL. Vercel Postgres integration sets this automatically.
.env.local
DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=..."
DATABASE_URL_UNPOOLED="postgresql://user:pass@ep-xxx.us-east-2.aws.neon.tech/josemadridsalsa?sslmode=require"

Authentication

VariableRequiredDescription
NEXTAUTH_URLProductionCanonical URL of the site. Auto-detected on Vercel in most cases.
NEXTAUTH_SECRETYesSecret used to sign JWT tokens. Generate with openssl rand -base64 32.

OAuth Providers

VariableRequiredDescription
GOOGLE_CLIENT_IDFor Google loginGoogle OAuth 2.0 client ID
GOOGLE_CLIENT_SECRETFor Google loginGoogle OAuth 2.0 client secret
GITHUB_CLIENT_IDFor GitHub loginGitHub OAuth App client ID
GITHUB_CLIENT_SECRETFor GitHub loginGitHub OAuth App client secret
FACEBOOK_CLIENT_IDFor Facebook loginFacebook App ID
FACEBOOK_CLIENT_SECRETFor Facebook loginFacebook App secret
APPLE_CLIENT_IDFor Apple loginApple Services ID
APPLE_CLIENT_SECRETFor Apple loginApple client secret (JWT)

A sign-in button appears only when both of its provider's variables are set, so each Vercel project (storefront and fundraising) shows only the providers it has keys for. Each site's domain also needs its callback, such as https://fundraising.josemadridsalsa.com/api/auth/callback/google, listed as an authorized redirect URI with the provider.

Encryption

VariableRequiredDescription
MASTER_KEYYes64-character hex string (32 bytes) for AES-256-GCM encryption of service keys. Generate with node -e "console.log(require('crypto').randomBytes(32).toString('hex'))".
ENCRYPTION_KEYYesBase64-encoded key for SMTP password encryption. Generate with node -e "console.log(require('crypto').randomBytes(64).toString('base64'))".

Stripe Payments

VariableRequiredDescription
STRIPE_SECRET_KEYYesStripe secret key (sk_test_... or sk_live_...)
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEYYesStripe publishable key for client-side (pk_test_...). Build-time: redeploy after changing it.
STRIPE_WEBHOOK_SECRETYesWebhook signing secret (whsec_...)

PayPal

VariableRequiredDescription
PAYPAL_CLIENT_IDFor PayPalPayPal REST app client id
PAYPAL_CLIENT_SECRETFor PayPalPayPal REST app secret
PAYPAL_SANDBOXNotrue uses the sandbox API host
PAYPAL_WEBHOOK_IDFor PayPalWebhook id used to verify inbound events. Missing means every webhook is rejected — the route logs CRITICAL rather than trusting the payload.
PAYPAL_RETURN_URLNoWhere PayPal returns the buyer after approval
PAYPAL_CANCEL_URLNoWhere PayPal returns the buyer on cancel
NEXT_PUBLIC_PAYPAL_CLIENT_IDFor PayPalBrowser copy of the client id that loads the PayPal and Venmo buttons. Unset hides both options at checkout.

Square

VariableRequiredDescription
SQUARE_ACCESS_TOKENFor SquareSquare access token
SQUARE_LOCATION_IDFor SquareSquare location the charge belongs to
SQUARE_SANDBOXNotrue uses the Square sandbox
SQUARE_WEBHOOK_SIGNATURE_KEYFor SquareVerifies inbound webhooks
SQUARE_WEBHOOK_URLFor SquareThe notification URL the signature is computed against
SQUARE_TERMINAL_DEVICE_IDFor POS and the kioskThe Square Terminal to send an in-person charge to
SQUARE_APPLICATION_IDFor the iPad kiosk card readerSquare Developer app ID used for Connect Square (OAuth)
SQUARE_APPLICATION_SECRETFor the iPad kiosk card readerThat app's OAuth application secret
NEXT_PUBLIC_SQUARE_APP_IDFor Cash App PaySquare application id loaded by the checkout's Cash App button
NEXT_PUBLIC_SQUARE_LOCATION_IDFor Cash App PaySquare location id for the same button. Both must be set or the option is hidden.
KIOSK_DEVICE_TOKENSFor the kioskComma-separated device tokens (24+ characters each), one per paired kiosk tablet

Webhook Secrets

Every inbound webhook is verified. A missing secret is a refusal, not a bypass — see Webhooks.

VariableRequiredDescription
STRIPE_WEBHOOK_SECRETYesStripe signature secret (also listed above)
PAYPAL_WEBHOOK_IDFor PayPalVerified via PayPal's own API
SQUARE_WEBHOOK_SIGNATURE_KEYFor SquareHMAC signature key
EASYPOST_WEBHOOK_SECRETFor shippingVerifies EasyPost tracking events
RESEND_WEBHOOK_SECRETFor email eventsVerifies Resend delivery/bounce events (Svix headers)

Scheduled Jobs

VariableRequiredDescription
CRON_SECRETYes in productionBearer token Vercel Cron sends to /api/cron/*. Outside production a missing value is allowed; in production a missing value makes every cron route refuse, rather than leaving them world-callable. See Scheduled Jobs.
UNSUBSCRIBE_SECRETFor marketing emailSigns one-click unsubscribe links

Email (Resend)

VariableRequiredDescription
RESEND_API_KEYYesResend API key (re_...)
FROM_EMAILNoDefault sender address. Defaults to orders@josemadridsalsa.com.
BUSINESS_POSTAL_ADDRESSNoPhysical mailing address printed in marketing-email footers, as CAN-SPAM requires. Defaults to the Zanesville address.
FUNDRAISING_REPLY_TONoReply-to address on fundraiser re-signup invitations. Defaults to the owner's address.
NEXT_PUBLIC_FROM_EMAILNoSender for queued bulk email. Falls back to FROM_EMAIL.
EMAIL_CHUNK_BUDGET_MSNoTime budget per email-queue run, in ms. Defaults to 45000.
EMAIL_SEND_DELAY_MSNoDelay between queued sends, in ms (keeps under Resend's rate limit). Defaults to 550.
EMAIL_IMAGE_BASE_URLNoAbsolute base URL for email header and footer images. Email clients cannot resolve relative paths, so every image needs a full URL. Defaults to the email-templates folder of the josemadridsalsa-blob Vercel Blob store, which npm run email:upload-images --workspace @jose-madrid/storefront -- --apply fills from public/email-templates. Leave it unset unless the images move to another host. No trailing slash.

Google Services

VariableRequiredDescription
NEXT_PUBLIC_GOOGLE_MAPS_API_KEYYesGoogle Maps JavaScript API key (client-side)
GOOGLE_MAPS_API_KEYFor locationsServer-side key used to geocode store locations (lib/geocoding.ts). Geocoding throws without it.
GOOGLE_PLACES_API_KEYFor reviewsGoogle Places API key (server-side)
NEXT_PUBLIC_GOOGLE_PLACE_IDNoGoogle Place ID for map accuracy
GOOGLE_PLACE_IDNoServer-side Google Place ID
NEXT_PUBLIC_GOOGLE_STREETVIEW_PANONoSpecific Street View panorama ID
GOOGLE_SERVICE_ACCOUNT_EMAILFor calendarService account email
GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEYFor calendarService account private key (include \n for newlines)
GOOGLE_CALENDAR_IDFor scheduleCalendar ID for "Where is Jose"
GOOGLE_CALENDAR_API_KEYFor scheduleAPI key used with GOOGLE_CALENDAR_ID to read the public schedule. Both must be set; the calendar must be public.
GOOGLE_MERCHANT_CENTER_IDFor Shopping syncMerchant Center account ID that products are pushed to
GOOGLE_MERCHANT_DATA_SOURCE_IDFor Shopping syncNumeric ID of the Merchant Center "API" data source that the Merchant API writes products into
GOOGLE_SHOPPING_SERVICE_ACCOUNT_EMAILFor Shopping syncService account added as a Merchant Center user; its Cloud project must be registered with the account (Merchant API developer registration)
GOOGLE_SHOPPING_SERVICE_ACCOUNT_PRIVATE_KEYFor Shopping syncThat service account's private key (include \n for newlines)

TikTok Shop

VariableRequiredDescription
TIKTOK_SHOP_APP_KEYFor TikTok Shop syncApp key of the TikTok Shop Partner Center app (separate from the TikTok posting app)
TIKTOK_SHOP_APP_SECRETFor TikTok Shop syncThat app's secret; signs every Partner API request
TIKTOK_SHOP_REFRESH_TOKENFor TikTok Shop syncRefresh token from the shop authorizing the app; re-authorize when it expires

File Uploads

VariableRequiredDescription
UPLOADTHING_TOKENFor uploadsUploadThing v7 token (dashboard → API Keys → V7). The v6 UPLOADTHING_SECRET / UPLOADTHING_APP_ID pair is no longer read.
BLOB_READ_WRITE_TOKENFor image hostingRead/write token for the josemadridsalsa-blob Vercel Blob store. Powers the Developer Console file explorer (/admin/developer/files), the product image uploader, the images:sync / images:migrate scripts, and email:upload-images. Get it from Vercel → Storage → josemadridsalsa-blob. Without it, every blob upload path is disabled and returns 503.

QuickBooks Online

The Client ID and Secret are optional here — the preferred place to enter them is Admin → Settings → Integrations, which stores the secret encrypted in the database. These variables exist as a fallback and are read only when no admin-entered credentials are present.

QUICKBOOKS_ENVIRONMENT has no admin-panel equivalent and must be set to reach real company data: it defaults to sandbox, and the Connect button on the integrations page connects to whichever environment it names. Left unset in production, the flow completes successfully against an Intuit sandbox company and syncs nothing real.

VariableRequiredDescription
QUICKBOOKS_ENVIRONMENTTo reach live bookssandbox (default) or production. Selects both the Intuit API host and which stored credential set is used.
QUICKBOOKS_CLIENT_IDNoIntuit app Client ID. Fallback only; admin-entered credentials win.
QUICKBOOKS_CLIENT_SECRETNoIntuit app Client Secret. Fallback only; admin-entered credentials win.

The redirect URI is derived from NEXTAUTH_URL as {NEXTAUTH_URL}/api/integrations/quickbooks/callback and must be registered verbatim in the Intuit app. Sandbox and production keys are different pairs, and credentials are stored per environment — production keys saved while the app is in sandbox mode are filed under sandbox and will not work.

BigCommerce

BigCommerce is the system of record for catalog, carts, checkout and orders; this app is a headless storefront on top of it. Jose Madrid runs two BigCommerce stores, and each needs its own store-level API account (BigCommerce admin → Settings → API → Store-level API accounts). Product ids are per store, so the two sets must never be swapped. A store with any of its four variables unset is treated as not configured.

VariableRequiredDescription
BIGCOMMERCE_STORE_HASHFor the storefrontMain store (josemadridsalsa.com) hash — the part after /stores/ in the API path.
BIGCOMMERCE_ACCESS_TOKENFor the storefrontMain store API account access token.
BIGCOMMERCE_CLIENT_IDFor the storefrontMain store API account client ID.
BIGCOMMERCE_CLIENT_SECRETFor the storefrontMain store API account client secret; also signs customer-login tokens.
BIGCOMMERCE_FUNDRAISING_STORE_HASHFor fundraising ordersFundraising store (josemadridsalsafundraising.com) hash.
BIGCOMMERCE_FUNDRAISING_ACCESS_TOKENFor fundraising ordersFundraising store API account access token.
BIGCOMMERCE_FUNDRAISING_CLIENT_IDFor fundraising ordersFundraising store API account client ID.
BIGCOMMERCE_FUNDRAISING_CLIENT_SECRETFor fundraising ordersFundraising store API account client secret.
BIGCOMMERCE_FUNDRAISING_STOREFRONT_URLNoFundraising store's storefront origin, where its hosted checkout and checkout form fields live. Defaults to https://josemadridsalsafundraising.com.
NEXT_PUBLIC_FUNDRAISING_SITE_URLNoOrigin of the fundraising app (apps/fundraising): its canonicals, sitemap and robots, and where the main site sends its old fundraiser paths. Set it in both Vercel projects. Defaults to https://fundraising.josemadridsalsa.com.
NEXT_PUBLIC_COMMERCE_BACKENDAt cutoverSet to bigcommerce to switch the storefront over: product prices and stock come from BigCommerce, and retail carts check out in BigCommerce's hosted checkout. Unset, the site prices and checks out as before. Fundraiser carts keep this site's checkout either way. Build-time: redeploy after changing it.
BIGCOMMERCE_CHANNEL_IDNoBigCommerce channel carts are created in. Defaults to 1, the existing storefront, whose checkout is served on josemadridsalsa.com — correct while that domain still points at BigCommerce. Once the domain points at this site, set it to the headless channel whose checkout domain is a subdomain.
BIGCOMMERCE_ORDERS_TO_QUICKBOOKSNotrue lets orders copied from either BigCommerce store (importSource = bigcommerce or bigcommerce-fundraising) flow into the hourly QuickBooks sync as sales receipts. Off by default: if online revenue already reaches QuickBooks another way, such as the Stripe and PayPal deposits, syncing these too would count every retail sale twice. Decide with whoever keeps the books before turning it on.
BIGCOMMERCE_STOREFRONT_URLAt domain cutoverWhere the old BigCommerce storefront lives once josemadridsalsa.com points here, e.g. https://shop.josemadridsalsa.com. When set, legacy login.php, account.php, giftcertificates.php and wishlist.php links go there (temporary redirects, query string kept) so customers reach their BigCommerce account; unset, they go to this site's pages. Build-time. See the cutover runbook.
BIGCOMMERCE_WEBHOOK_SECRETFor live catalog updatesShared secret BigCommerce sends in a header on every webhook; /api/webhooks/bigcommerce refuses calls without it (and refuses everything when it is unset). Any long random string. Register the hooks after deploying with npm run bigcommerce:webhooks --workspace @jose-madrid/storefront -- https://<site-origin> (add --store fundraising for the fundraising store), run with production's values; re-run it to revive hooks BigCommerce disabled after an outage.

The API accounts need modify on Products, Carts, Checkouts, Customers, Channel settings and Sites & routes, and read-only on Orders and Information & settings. The main store's account also needs Themes: modify (and Content: modify is useful) for the checkout-theme tooling (npm run bigcommerce:theme). A 403 You don't have a required scope on every call means the account was saved with no scopes; a 401 means the token or store hash is wrong.

Analytics

VariableRequiredDescription
NEXT_PUBLIC_GOOGLE_ANALYTICS_IDNoGoogle Analytics measurement ID (G-XXXXXXXXXX)
NEXT_PUBLIC_VERCEL_ANALYTICS_ENABLEDNotrue loads Vercel Analytics on public pages
NEXT_PUBLIC_AMPLITUDE_API_KEYNoAmplitude project key. Browser analytics and session replay (after cookie consent), and server-side Agent Analytics for the Claude calls

Shipping

VariableRequiredDescription
SHIPPING_PROVIDERNoShipping rate provider: easypost or shippo
SHIPPING_API_KEYFor ratesShipping provider API key
SHIPPING_TEST_MODENoSet to "false" for production
SHIPPING_ORIGIN_ADDRESSFor rates and labelsWarehouse street address
SHIPPING_ORIGIN_CITYFor rates and labelsWarehouse city
SHIPPING_ORIGIN_STATEFor rates and labelsWarehouse state (2-letter code)
SHIPPING_ORIGIN_ZIPFor rates and labelsWarehouse ZIP code
SHIPPING_ORIGIN_COUNTRYNoDefaults to US
SHIP_FROM_NAMENoSender name on labels. Defaults to Jose Madrid Salsa
SHIP_FROM_STREET, SHIP_FROM_CITY, SHIP_FROM_STATE, SHIP_FROM_ZIP, SHIP_FROM_COUNTRYNoLegacy aliases for the SHIPPING_ORIGIN_* variables above, still read as a fallback. Prefer SHIPPING_ORIGIN_*
ORDER_SMS_ALERTS_ENABLEDNoSet to "true" to show the text-alert opt-in on /order-tracking. Leave unset until an SMS provider is wired up, or customers will sign up for texts that never arrive

Set the warehouse address

Rate quoting and label purchase both read the warehouse address through lib/shipping/origin.ts, which takes Settings → Shipping first and these variables second. Until one of the two is complete, no real carrier rate can be fetched — checkout falls back to flat-rate estimates and logs why.

They used to be configured separately: quoting read SHIPPING_ORIGIN_* and defaulted to a placeholder address in San Francisco when unset, while label purchase read SHIP_FROM_*. A half-configured deployment therefore quoted customers from one address and shipped from another, with nothing in the response to indicate it.

Monitoring

VariableRequiredDescription
SENTRY_ORGFor SentrySentry organization slug
SENTRY_PROJECTFor SentrySentry project slug
SENTRY_AUTH_TOKENFor SentrySentry auth token for source map uploads

AI

VariableRequiredDescription
ANTHROPIC_API_KEYFor AI chatAnthropic API key. Powers the Picante chat assistant and the form-capture extractor.
ANTHROPIC_MODELNoModel used by the Picante chat assistant. Defaults to claude-opus-5; claude-haiku-4-5 is the cheaper option.
AI_CHAT_PROVIDERNoBackend for /api/ai-chat: anthropic (default), openai, or smileyface.
NEXT_PUBLIC_AI_CHAT_PROVIDERNoBrowser-visible copy of the same choice, used only for the "Powered by" label in the chat widget.
OPENAI_API_KEYFor AI_CHAT_PROVIDER=openaiOpenAI API key. Only read when the provider is set to openai.
OPENAI_MODELNoModel used when the provider is openai. Defaults to gpt-4o-mini.
SMILEYFACE_API_KEYFor AI_CHAT_PROVIDER=smileyfaceSmileyFace API key. The chat returns 400 without it when that provider is selected.
SMILEYFACE_API_BASENoSmileyFace API base URL. Defaults to https://api.smileyface.ai/v1.

Customer Email Triage

The Gmail triage reuses the Google OAuth client and the Anthropic key; it adds no variables of its own. The mailbox grant itself is stored encrypted in the database, not in the environment — connect it at /admin/inbox/settings.

VariablePurpose
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRETThe OAuth client the Gmail grant is made against. Needs gmail.modify and gmail.send on its consent screen, and /api/admin/inbox/google/callback as a redirect URI.
ANTHROPIC_API_KEYClassifies each message and writes the reply. Without it every email escalates to a human rather than going unread.
ANTHROPIC_MODELOptional override; defaults to claude-opus-5.
CRON_SECRETGuards /api/cron/inbox-triage, as it does every scheduled route.
MASTER_KEY / ENCRYPTION_KEYEncrypt the stored Gmail tokens at rest.

Internal

VariableRequiredDescription
SERVICE_API_KEYNoShared secret for internal service-to-service API calls
ADMIN_SECRET_TOKENNoAn admin_token cookie equal to this value is treated as an admin session (lib/admin-auth.ts). Leave unset in production.
IMPORT_SECRETNoRequired by /api/import-locations-secret; unset disables that route
APP_URLNoBase URL for fundraiser approval, share-shield and donation links. Falls back to the request origin.
SALSADOCS_GITHUB_TOKENFor docs publishingGitHub token the Developer Console uses to publish to the salsadocs repo
SALSADOCS_GITHUB_REPONoDefaults to jordolang/salsadocs
SALSADOCS_GITHUB_BRANCHNoDefaults to main
SALSADOCS_CONTENT_DIRNoDefaults to content/docs
NEXT_PUBLIC_SITE_URLProductionThe site's public origin, e.g. https://www.josemadridsalsa.com (the default). Canonical links, the sitemap, structured data, feeds, email links and the domain printed on invoices and packing slips are all built from it (lib/site-url.ts). Build-time: redeploy after changing it.
NEXT_PUBLIC_BASE_URLNoPublic-facing base URL used by some email links and product feeds. Falls back to NEXT_PUBLIC_SITE_URL.
NEXT_PUBLIC_APP_URLNoBase URL for share links and order-rule emails. Falls back to NEXTAUTH_URL, then NEXT_PUBLIC_SITE_URL.

Moving the site to another domain: set NEXT_PUBLIC_SITE_URL, NEXT_PUBLIC_BASE_URL, NEXT_PUBLIC_APP_URL and NEXTAUTH_URL to the new origin in Vercel (production), update Admin → SEO → Site URL (SeoConfiguration.siteUrl), and redeploy. No code change is needed.

Notifications & Contact

Staff inboxes are comma-separated lists. Public contact values all have built-in defaults.

VariableRequiredDescription
ORDER_NOTIFICATION_EMAILSRecommendedStaff inboxes alerted on new orders. Falls back to INVENTORY_ALERT_EMAILS; with neither set, no one is told about orders.
INVENTORY_ALERT_EMAILSRecommendedStaff inboxes for low-stock alerts
SUPPORT_EMAILNoWhere new customer message threads are forwarded
FUNDRAISING_EMAILNoInbox for fundraiser sign-ups and fundraising-site order submissions
SYSTEM_OWNER_EMAILNoUser that owns system-created forms (lib/forms/ownership.ts)
NEXT_PUBLIC_SUPPORT_EMAILNoSupport email shown in the footer and on the contact page
NEXT_PUBLIC_SUPPORT_PHONENoSupport phone shown in the footer and on the contact page
NEXT_PUBLIC_HQ_LOCATIONNoHeadquarters address shown in the footer and on the contact page
NEXT_PUBLIC_FACEBOOK_URLNoFacebook link in the testimonials section
NEXT_PUBLIC_GOOGLE_BUSINESS_URLNoGoogle Business review link
GOOGLE_REVIEW_URLNoReview link on the order-confirmation page (takes precedence over NEXT_PUBLIC_GOOGLE_BUSINESS_URL)
NEXT_PUBLIC_FULFILLMENT_EMAILNoContact email shown on the merch pages
PRINTIFY_API_TOKENFor merchPrintify personal access token (products and orders scopes). Without it /merchandise shows a coming-soon message. See Printify.
PRINTIFY_SHOP_IDNoComma-separated Printify shops to sell from; defaults to every shop on the account

Fundraising & Arena

VariableRequiredDescription
FUNDRAISER_API_SECRETFor sale ingestHMAC secret for POST /api/fundraiser/sale (lib/fundraiser-auth.ts)
ARENA_SHARE_SECRETFor share shieldsSigns arena share nonces. At least 32 characters; share links fail without it.
ARENA_GAME_ORIGINSNoExtra Battle Arena 3D game origins (comma separated, e.g. a custom domain) allowed to receive game sign-in tokens and call the game API. The published game is always allowed.

Platform Agent (apps/agent)

Set these in apps/agent/.env.local, not the storefront's.

VariableRequiredDescription
AI_GATEWAY_API_KEYOne of theseVercel AI Gateway key used to reach the agent's model
VERCEL_OIDC_TOKENOne of thesePulled automatically by eve link; the alternative to an AI Gateway key
STOREFRONT_API_URLNoBase URL the agent's read-only tools call. Defaults to https://www.josemadridsalsa.com. Point it at http://localhost:3000 to run against a local storefront.

Draft-only Email Agent (apps/agents/email-agent)

Read from the environment of the Hermes cron job that runs the agent. All are optional.

VariableDescription
ANTHROPIC_API_KEYCalls Claude directly. Without it the agent uses the Hermes Anthropic provider.
EMAIL_AGENT_MODELModel used to classify each message. Defaults to claude-sonnet-4-5.
EMAIL_AGENT_TIMEOUT_MSTime limit for one message's model call. Defaults to 120000; an invalid value also falls back to it. A message that runs over is listed for the owner and retried at the next review.
EMAIL_AGENT_QUERYGmail search for the inbox review. Defaults to the last 7 days, excluding Promotions and Social.
EMAIL_AGENT_MAXMost new messages analyzed per review. Defaults to 25.
EMAIL_AGENT_SEARCH_MAXHow many matching inbox messages are searched to find new ones, since processed mail stays in the inbox. Defaults to 500.
EMAIL_AGENT_STATE_PATHWhere processed message IDs are kept. Defaults to email-agent/state.json under the Hermes home.
HERMES_HOMEHermes profile directory holding the Google OAuth token. Defaults to ~/.hermes.
PYTHON_BINPython with the Google API client installed, used for Gmail calls. Defaults to python.

Mobile Fundraiser App (apps/fundraiser-app)

Build-time variables for the Expo app, not the storefront. Set them in the shell or in an EAS build profile (apps/fundraiser-app/eas.json).

VariableRequiredDescription
SQUARE_APPLICATION_IDNoSquare application id built into the app for card payments. Defaults to the shop's production app id (set on the Square plugin in app.json); set a sandbox app id for a sandbox build. Not a secret.
EXPO_PUBLIC_API_URLNoStorefront the app talks to. Defaults to https://www.josemadridsalsa.com (extra.apiUrl in app.json). Point a development build at a local storefront on your network, e.g. http://192.168.1.20:3000.

How is this guide?

Edit on GitHub

Last updated on

On this page