Skip to main content

Send Your Members to a Deal with Member Links

You run a members site for a syndicate (or a landing page for your company's round). A member clicks a deal card, lands on the deal's Wefunder page, and invests there. Wefunder handles the account, KYC and payment. You get the outcome for that member, keyed on your own member id. This guide builds that flow end to end with member links.

What you need​

  • An app with read:invite_links and write:invite_links ("View / Create investment links") ticked in the developer portal.
  • That app installed on your syndicate (or company), after ticking the scopes, and an installation token for the install. This guide calls it WEFUNDER_TOKEN.
  • An open offering on that syndicate or company. Note its id (ofr_…), for example from GET /syndicates/{id}/deals.

Keep the token on your server. Every call below runs server-side.

Don't mint links ahead of time. When a member clicks Invest on a deal card, your server asks Wefunder for that member's link on that offering and redirects them to it. Pass your member id as reference: repeating the same reference on the same offering returns the live link (200) instead of minting a new one, so you don't need to store anything to make the click idempotent.

curl -X POST https://wefunder.com/api/v2/offerings/ofr_2nVb8KxQ4tLm9RcW7pHs3FdY/member_links \
-H "Authorization: Bearer $WEFUNDER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"member_link": {"reference": "member_8812"}}'

The response's url is the offering's Wefunder deal page with the link's token. Send the member there.

2. Track what each member did​

List your install's links on an offering and read each link's state. The list is newest first and paginated: follow meta.next_cursor while meta.has_more is true.

curl https://wefunder.com/api/v2/offerings/ofr_2nVb8KxQ4tLm9RcW7pHs3FdY/member_links \
-H "Authorization: Bearer $WEFUNDER_TOKEN"
stateWhat happenedWhat to show the member
createdThey haven't redeemed it yet"Invest"
boundA Wefunder account holds it (they invested through it, or you pre-bound it)"Continue on Wefunder"
investedThat account invested in this offering after you minted the link; investment_id is set"Invested"
canceledYou canceled it before any investmentMint a fresh link on the next click

Match rows to your members by reference. Responses carry Wefunder ids only, never the member's email. Webhooks for these changes aren't available yet, so poll, for example when the member opens your deals page or on a schedule.

3. Bind repeat members up front​

The first time a member invests, their link binds to whichever Wefunder account they used, and wefunder_user_id shows up on the link. Save it against your member. On their next deals, pass it when you mint:

if (member.wefunderUserId) body.member_link.wefunder_user_id = member.wefunderUserId;

The link is then bound before they click, so a copy forwarded to someone else is useless to them.

If you repeat a reference with a different wefunder_user_id than the account its link is bound to, you get 409 reference_conflict: the link already belongs to that account.

To withdraw an invitation, cancel the link:

curl -X POST https://wefunder.com/api/v2/member_links/il_8kQm2xVb7nRt4WcY9pLe3HdA/cancel \
-H "Authorization: Bearer $WEFUNDER_TOKEN"

Nobody can redeem it after that, and a checkout started after the cancel is priced at standard terms. An investment already made through it keeps its terms. A link nobody invested through is also released from any account you pre-bound it to. Uninstalling your app does the same for every link nobody invested through.

What your members see​

  • Private rounds and invited pricing. A member link carries the invitation of the syndicate's manager or the company's founder, so it opens a private round's deal page and prices the investment as invited.
  • The wrong account. A bound link answers only to its account. Anyone else who opens it, logged out or signed in to a different account, gets nothing from it and sees a prompt to sign in with the invited account, with a masked hint of the address (like [email protected]). If your member has two Wefunder accounts, that hint tells them which one to use.

Troubleshooting​

ResponseCauseFix
404 on createThe token isn't an installation token, the install doesn't cover this offering's syndicate or company, or the offering id is wrongUse the installation token for the install on the offering's syndicate or company
404 on create with wefunder_user_idNo Wefunder account with that idPass the usr_ id exactly as a bound link returned it
403Your app isn't approved yet and the installer doesn't manage your app's organizationUse it on your own syndicate or company, or request approval in the portal
422 offering_not_openThe offering isn't open for investment yet, or has closedMint once it opens
422 offering_has_no_pageThe company has no Wefunder page to link toPublish the company page
409 reference_conflictThe reference's live link is bound to a different accountUse the wefunder_user_id the link already has, or a different reference

To test in the sandbox, use your realm syndicate's open deal; see the sandbox walkthrough.