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:
- Create the merchant with your Partner Key (
merchants.create), passing your ownexternalReffor idempotency and — if you want the client to log in — theiremail. - 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.
- 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
store_xxx) so the CRM is immediately usable.
country / currency you pass on create() are provisioning inputs — currency 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 secondcreate() with the same externalRef returns the same merchant — retries are safe:
(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, passemail on create() (as above) or invite them later:
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.
- 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.
- 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. - From that point the account behaves like a regular self-serve merchant — dashboard access, notifications, team management.
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.
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.{ 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.