---
id: "12.1"
title: "Partner onboarding"
dept: customer-success-and-support
status: draft
owner: Param
branded: false
last_verified: "2026-10-26"
sources:
  - "brew/auth.js:78, 102, 108-110, 125, 189-190"
  - "brew/build.js:94, 226-227, 239, 363, 1012-1019, 1070"
  - "brew/confirm-remind.js:21, 70-74, 84-87"
  - "brew/connectors/index.js:53, 482-493"
  - "brew/connectors/protected.js:1-3"
  - "brew/closed-gate.js:31-32"
  - "brew/legal-pages.js:36-40"
  - "brew/public/app.js:286-290, 405-409, 773, 786, 818, 843"
  - "brew/server.js:761"
  - "brew commits 119dc8a, deb7d90, 41b0258"
  - "memory brew-live-stores, brew-access-rules, brew-prod-backend, brew-feed-open-moves, brew-real-connectors, brew-connect-refresh, brew-meta-app-review, brew-shopify-app-review, never-disconnect-arata-meta"
  - "brand-directions/book/content/c1.js c-1b, checked against the code"
---

# Partner onboarding

## Answer

The first week with a design partner, from the first sign in to the first brief, and the checklist our team runs so every partner starts the same way.

## Today

### Who we onboard

| Fact | Source |
|---|---|
| The five design partners are Arata, Nutrova, Mana, Puma India and Scrubroom. Cozy Snugglet and Zenant are our own test brands. | [src: memory brew-live-stores] |
| All five live on production at feed.joinsquareup.com since 25 Oct. Staging at brew.joinsquareup.com is for testing only. | [src: memory brew-prod-backend; brew commit 119dc8a] |
| On 25 Oct a commit moved Arata and Nutrova back to staging for a 26 Oct onboarding, and a later commit the same evening moved every partner home to production again. | [src: brew commits deb7d90, 119dc8a, 41b0258] |
| The five were copied to production on 25 Oct with their reads, Plays and connections. Jams, finals and simulated connector data stayed on staging. | [src: memory brew-prod-backend] |
| The preview is free and offered as it is. | [src: brew/legal-pages.js:40] |

### Getting in

- Only three kinds of people open a brand: our own staff domains, someone with an email at the brand's own domain, or someone the team invited. [src: memory brew-access-rules]
- Sign in is Google only. The landing says email sign in is coming. [src: brew/public/app.js:409]
- Anyone else sees one wall that points to the demo stores. [src: brew/public/app.js:286-290]
- Someone without the brand's email cannot start a new read of it. [src: brew/server.js:761]
- A teammate who signs in with the same company domain joins on their own, and the admins get an email. [src: brew/auth.js:108-110, 125]
- An invite link works for 14 days and only for the invited Google account. [src: brew/auth.js:78, 190]
- A pending invite also works if the person arrives another way and signs in with that email. [src: brew/auth.js:102]
- A store still behind Shopify's password page is shown to its own team only. [src: brew/closed-gate.js:31-32]

### The first run

| Step | What the product does | Source |
|---|---|---|
| Landing | Says `Your store’s marketing team, in one feed.` and asks for the website. | [src: brew/public/app.js:405] |
| Limits | One new brand an hour from the same network, and a daily reading budget. | [src: brew/build.js:226-227] |
| Check what we read | The brand brief waits 15 minutes for the team to check the read, then goes on with what was read. | [src: brew/build.js:94] |
| Check reminders | If nobody checks, the starter and the admins get an email after 3 hours and once more after a day. | [src: brew/confirm-remind.js:21, 70-74] |
| Feed gate | On a brand's first read the Plays wait until someone opens the feed. Reminders follow at 3 hours and a day. | [src: brew/build.js:239, 363; brew/confirm-remind.js:84-87; memory brew-feed-open-moves] |
| Set up screens | Who's this feed for, Anything Brew should know, Connect your tools, Invite your team. | [src: brew/public/app.js:773, 786, 818, 843] |
| Plays ready | Emails go to the whole team when the first Plays land and when all are in. | [src: brew/build.js:1012-1019] |

### Connecting accounts

- Only an admin or our staff connect or disconnect. Teammates can only sync. [src: memory brew-real-connectors]
- Shopify connects through the brand's own Dev Dashboard app. One click install waits on Shopify's review of our public app, submitted 21 Oct. [src: memory brew-real-connectors, brew-shopify-app-review]
- Meta connects in one click, but until Meta App Review passes only people with a role on our Meta app can connect. Review was blocked on 24 Oct by business verification and two screencasts. [src: memory brew-real-connectors, brew-meta-app-review]
- Google Analytics connects by adding our service account as Viewer and pasting the property ID, or by one click Google sign in. [src: memory brew-real-connectors]
- Klaviyo and Judge.me connect with a pasted key. [src: memory brew-real-connectors]
- The first real connection rewrites every Play privately for the team, capped at $40 a brand, after a 30 minute quiet period. [src: brew/build.js:1070; memory brew-connect-refresh]
- A Meta sign in that will run out triggers an email to admins 7 days ahead and again when it runs out. [src: brew/connectors/index.js:53, 482-493]
- Arata's Meta and Shopify connections are protected in code and are never disconnected. [src: brew/connectors/protected.js:1-3; memory never-disconnect-arata-meta]

## Tomorrow

| Version | Tag | Item |
|---|---|---|
| v1 | New | A first week checklist per partner, kept in this document and run by one named person on our team. |
| v1 | New | Activation means the first brief shared, to the brand's own team or to ours, within the first week. The old book proposed heart one, make one, hand off one; today's code has no first win bar, so the brief is the event we can count now. |
| v1 | Changes | Shopify partners install from the Shopify admin once our public app is approved, and skip pasting the address. |
| v1 | Changes | Meta connects for any partner once App Review passes. Until then we add each partner's Meta person as a role on our app. |
| v1 | Stays | Read only. Nothing is posted, sent to customers or spent from a partner's accounts. |
| v1 | Stays | The feed gate: Plays are written only once the team has finished onboarding and corrections are in. |
| v2 | New | A short welcome call script, if Param wants one, once the checklist has run on all five. |

## How we do it

Run this for every partner, in order.

1. Before the first sign in, write down the brand's official domain and who its admin is. Only that domain, or an invite, gets in.
2. Confirm the brand is on production and reads its connections.

   ```bash
   gcloud run jobs execute brew-ops --region=asia-south1 --wait
   ```

   The job runs `db/status.mjs` and shows connection states and table sizes.
3. Send the partner the production address, feed.joinsquareup.com plus the brand's slug, and ask them to sign in with their work Google account.
4. Watch for the sign in. Staff can read who opened a brand:

   ```text
   GET /api/admin/visitors?slug=<slug>
   ```

5. Ask them to check what we read within 15 minutes, or the brief goes on without their corrections.
6. Ask them to open the feed. The Plays start then, and land one by one.
7. Help them connect accounts in this order: Shopify, Google Analytics, Meta, then Klaviyo or Judge.me if they use them. Only their admin can connect.
8. Ask them to invite one teammate from Invite your team.
9. By the end of the week, walk them through one jam to a shared brief.
10. Never disconnect, reconnect or reselect any Arata connection (Meta, Shopify or any other), in any step or rollback (Param, 26 Oct). Disconnect tests run on Cozy or Zenant only.

## Numbers

| Metric | Definition | Where measured | State |
|---|---|---|---|
| Time to first check | Minutes from the read finishing to the team confirming what we read | `status.json` confirm stage and waitingSince, see confirm-remind.js | Proposed |
| Time to first feed open | Hours from the brief to the first feed open | `status.feedOpenAt` against the brief stage time | Proposed |
| Activated in week one | Share of partners with one shared brief within 7 days of the first read | jam `jamBrief.sharedAt` per brand | Proposed |
| Accounts connected | Real connectors live per partner at day 7 | connections per brand, `db/status.mjs` | Proposed |
| Team size | People on the brand's team at day 7 | `access_log` and members per brand | Proposed |

## Open

1. Who on our team owns each partner's first week? Proposal: Param owns Arata and Nutrova, Sai and Arvind split the other three, one name per brand written here.
2. Is the first brief shared within 7 days the activation event? Proposal: yes for v1, and revisit once the five have each shared one.
3. Do invited teammates see the set up screens on first open? The code does not say clearly. Proposal: test it on Zenant with a fresh invite and record the answer here.
4. Should every partner get a welcome call in week one? Proposal: one 30 minute call on day 1 or 2, run from the checklist above.
