Skip to main content

CRM provisioning (merchants)

A merchant (acc_xxx) is the CRM organization: it owns stores, products, orders, customers, subscriptions, and CRM Keys. This page covers provisioning merchants and minting CRM Keys on the CRM domain (/api/public/v1/partner/*). The full onboarding lifecycle, in one pass:
  1. Create the merchant with your Partner Key (merchants.create), passing your own externalRef for idempotency and — if you want the client to log in — their email.
  2. The contact receives an invitation email fully branded as you (your name, logo, colors — TagadaPay never appears), sets their own password, and lands on your CRM host as admin of their organization.
  3. Mint a CRM Key (merchants.keys.create) whenever your backend needs to read or manage that merchant’s data on their behalf.
CRM-only is valid. A merchant does not need a TPA. If your product only uses the merchant control plane (catalog, orders, customers, subscriptions) and processes payments elsewhere, you never have to touch the Processing domain.When you do want TagadaPay to process cards: CRM-only partners submit an entity application (partners.processing.applications.create({ accountId })) or embed; payfac partners use tpas.create(). See Processing provisioning.

Create a merchant

Creating a merchant also auto-provisions a default store (store_xxx) so the CRM is immediately usable.
country / currency you pass on create() are provisioning inputscurrency sets the auto-created store’s base currency. They are not stored on the merchant object itself, so the response always returns country: null and currency: null. Read per-store currency back via the CRM stores API.

Idempotency

A second create() with the same externalRef returns the same merchant — retries are safe:
The idempotency key is the (partnerId, externalRef) pair and is permanent. You can also pass it via the Idempotency-Key header — the body value wins.

Invite the merchant to the dashboard

By default, a merchant you create by API is API-only: nobody can log in to it, and it does not appear in the CRM dashboard. To hand the account over to your client, pass email on create() (as above) or invite them later:
If the email already has a TagadaPay account with one of your merchants, nobody is emailed. We add that person to the merchant’s organization on the spot and answer status: 'added'. There is no link, so there is nothing to expire, nothing to click, and no way for them to end up creating a second account by mistake. This is the case that used to hurt: a merchant who had signed up on their own — often into a duplicate organization — could only be reached through a link that had usually already died. Everyone else gets the invitation flow: a brand-new email, and also an existing TagadaPay account that has no organization of yours. Adding someone to an organization is silent, so we only do it for people already inside your account; anyone else has to accept, which keeps you from attaching a stranger who never agreed to it.
  1. The contact receives an invitation email branded with your partner identity (your name, logo and colors from your partner profile — TagadaPay does not appear anywhere in the email), with an accept link.
  2. On acceptance they choose their own password and land in the CRM dashboard. Partners with a dedicated CRM host (e.g. crm.yourbrand.com) get the acceptance page skinned with their brand and the user is dropped onto their host, not TagadaPay’s.
  3. From that point the account behaves like a regular self-serve merchant — dashboard access, notifications, team management.
The four statuses: The call is idempotent in every direction: repeat it as often as you like, it never fails for work that is already done. Note that sending a new invitation (e.g. after a previous one expired) invalidates earlier links — only the most recent email works.

Developers and team members

role defaults to admin, the merchant’s own contact. Pass member for the developers and team members you add alongside them:
One email, one person. If several TagadaPay users share the address you pass, we refuse with 409 ambiguous_email rather than guess which one to add to your merchant’s organization. Contact your account manager to get them merged.
Branding comes from your partner profile. The email name, logo, colors, dashboard host and reply-to address are configured once on your partner profile by your TagadaPay account manager. Until they’re set, the email falls back to your partner name with a neutral look. Optionally, configure your own DKIM-verified sending domain so even the technical From address is yours.
Silent merchants stay silent. If your partner agreement uses the silent-merchant model (Tagada never contacts your merchants directly — merchantPortalAccess: 'never'), invites are rejected with 403 portal_access_never. Contact your account manager to change the policy.

Retrieve / list


Mint a CRM Key

A CRM Key (sk_crm_…) grants access to /api/public/v1/* for this one merchant.
The token is returned only on creation. Store it in your secret manager immediately. Existing UUID tokens keep working — only newly minted keys use the sk_crm_… format.
Use the token as a normal merchant client:
See API keys & authentication for rotation patterns and the full three-key model.

Query the merchant’s data

Once you hold a CRM Key, the client behaves exactly like a merchant’s own key — the whole CRM read surface is available on behalf of that one merchant (acc_xxx). This is what you use to build a merchant dashboard, reconcile orders, or pull reporting into your own backend.
events.list on high-volume merchants. The behavioural event stream (app_events) can be very large. Always scope events.list with a storeId and a tight date window, or use events.statistics / events.recent — an unfiltered events.list on a big merchant can time out. For heavy analytics, prefer aggregated reporting over paging raw events.
Every listing returns the same envelope: { data, total, page, pageSize, totalPages, hasMore }. Retrieve single records with orders.retrieve(id), payments.retrieve(id), customers.retrieve(id), products.retrieve(id), etc.

Common errors


Next step

Add card processing (TPA)

When this merchant needs to take payments through TagadaPay, provision a TPA bound to its acc_xxx and mint a Processing Key.