Raheem Offer Pro — Page 2 · Send

Buyer signed. Now it goes out.

Upload the signed offer package, proof of funds, and the listing-agent spreadsheet. This matches every offer to its listing agent and preps a ready-to-go email — nothing leaves this browser tab, nothing is uploaded anywhere.

A Send batch to buyer for e-signature optional — skip if you already pushed from Generate

If you generated this batch on the Generate offers page, it was already pushed here automatically — you don't need this step, just scroll to Step 01 below. Use this only as a fallback: to (re)upload a ZIP by hand, or to resend/rotate a buyer's link.

After a buyer link already exists for this email, this is only used if you check "generate a new link" below — an existing valid link keeps its original expiry.

Only check this if the old link leaked or you want to force a fresh one — it immediately breaks any link already sent.

Your buyers

Every buyer you've sent offers to, from here or from Generate. Click a name to jump straight to their status — the link works even after you close this tab, so bookmark or save it if you want to check back later without hunting for the email.

This list only lives in this browser. If you sent offers from a different browser, device, or a private window, they won't show up here automatically — use the box below to pull a buyer back in by email (no data is lost, this just re-adds them to this list).

Removed offers no longer needed

Someone beat you to it, the buyer walked, whatever the reason — offers removed here are skipped entirely the next time you build the queue below, and won't appear in any download or spreadsheet. Click "restore" to put one back.

Blocked listing agents hard block

A blocked agent's rows are skipped automatically the next time you build the queue — matched by email first (more reliable), name as a fallback if no email is on the row. Skipped rows are called out clearly in the status message, never silently dropped.

No agents blocked.

Follow-up queue 0 ready

Every offer you send with "Send Now (Gmail)" lands here automatically. Once 3 day(s) pass with no update from you, it shows up as ready to follow up. Mark whether they've replied, edit the message if you want, send when ready — nothing goes out on its own.

Follow-up settings (trigger day, message templates)

Nothing ready for follow-up yet.

Repeat listing agents 0 found

Agents tied to 2+ properties — combining everything currently in your send queue with everything you've sent before, matched by email first, name as a fallback. Worth knowing either way: a friendly repeat contact, or a reason to look closer.

None found yet — build a send queue below, or this fills in as you send more offers over time.

Listing status tracking Not connected

Bring your own data source to check whether a property is still active, went pending, or sold to someone else. Two kinds work here: your own MLS access (RESO Web API, if you're a licensed broker/agent with credentials), or a non-MLS listing-status API you've separately signed up for. Neither is included with this tool — you'll need your own account and API key from whichever you use.

How do I get an API key? (MLS for agents / non-MLS for wholesalers)

If you're a licensed agent/broker with real MLS access:

  1. Contact your MLS's support desk (not Raheem) and ask specifically for "RESO Web API" developer/API access — most MLSs run on a platform like Trestle, Spark API, Bridge Interactive, or MLS Grid, and this is a standard, named product they offer members.
  2. They'll issue you a Web API base URL and either a Client ID/Secret or a bearer token — this can take anywhere from same-day to a couple weeks depending on your MLS.
  3. Back here, set Provider type to "My own MLS (RESO Web API)," paste the base URL and token into API key / token.
  4. In Advanced, RESO's standard field names are UnparsedAddress for the address param and StandardStatus for the status field — use those unless your MLS's docs say otherwise.

If you're a wholesaler without MLS access:

Worth knowing upfront: Zillow shut down its old public API in 2021 and doesn't offer a self-serve one today — its official replacement, Bridge Interactive, is gated to MLS-affiliated brokerages, so it's not an option here either. In practice, wholesalers use a third-party property-data API instead — a separate company that sells REST API access to listing/property data. A few names worth searching (not an endorsement — vet pricing, terms, and coverage yourself before signing up): RentCast, ATTOM Data, or listings on RapidAPI's real-estate category.

  1. Sign up directly with whichever provider you choose and get their API key/token plus their docs.
  2. Back here, set Provider type to "Non-MLS listing-status API," and fill in the base URL and key from that provider.
  3. In Advanced, match their docs exactly: the header name they expect (often Authorization or X-API-Key), the query param name for the address, and the JSON path to the status field in their response.
  4. Use the "Test with an address" button below once saved — that's the fastest way to confirm the field names actually line up before relying on it in a real batch.
Connect / edit provider
Advanced (header name, address field, response path)

Lead import Not connected

Bring your own API key from a lead-generation platform (PropStream, BatchLeads, PropertyRadar, REsimpli, DealMachine, or any other REST API that returns property/owner data) and pull leads straight into a ready-to-use Master Offer List — no manual retyping. Deal-specific columns (price, sale type, deposits, dates, terms, listing/escrow agent) aren't something a lead platform has, so those stay blank for you to fill in after import; this only covers property address, owner name, county, property ID, and legal description.

How do I get an API key from a lead platform?

Every platform's process is a little different, but the shape is the same everywhere:

  1. Log in to your lead platform's account (not Raheem) and look for a settings page called API, Integrations, or Developer — this is usually only available on paid or higher-tier plans, so check your plan first if you don't see it.
  2. Generate an API key/token there. Some platforms (e.g. PropertyRadar, BatchLeads/BatchData) offer this fairly directly; others require contacting their support or sales team to turn it on.
  3. Copy the base endpoint URL their docs give you for listing/searching leads, along with the key.
  4. Back here, paste both in below. In Advanced, match their docs exactly for the auth header name and the JSON path to the array of leads in their response.
  5. In the field mapping below, tell it where in each lead object to find the address, owner name, etc. — every platform names these differently, so check a sample response in their docs (or use Test fetch below, which shows you the raw response).

Not affiliated with or endorsed by any specific platform — vet pricing, data quality, and terms with whichever one you choose.

Connect / edit provider
Advanced (header name, extra params, response path)

Builds a Master Offer List in the exact column order the batch generator expects, with Property Address / Owner Name / County / Property ID # / Legal Description filled in from your lead platform and every deal-specific column (price, sale type, dates, terms, agents) left blank for you to fill in — then downloads it, ready to upload on the Generate offers page.

Submission forms for listing agents

Fills the Offer Submission Form template straight from the offer data Page 1 already generated for this batch — no re-uploading the Offer List, no pushing to the buyer. Once generated, these fill in automatically as the "Submission" attachment for every matching offer below — no re-upload needed.

Honest limitation, upfront: no browser can attach files to an email and hit send automatically — that's blocked everywhere for security, not just here. This tool gets you as close to one-click as actually exists:
  1. Click Preview 3 attachments on a card — check the contract, submission form, and proof of funds look right and professional before you send anything (worth doing on your first offer or two each batch).
  2. Click Get 3 attachments — downloads the signed contract, submission form, and proof of funds as three separate files, ready to drag straight in (your browser may ask permission the first time you download more than one file at once — allow it, this is normal).
  3. Click Open Email — opens your email app with To, CC, subject and the hello message already filled in.
  4. Drag the 3 downloaded files into the compose window, hit send.
On sending as your connected Gmail address: mailto links can't set the "From" address — that's set by whichever email account is your browser/OS default, not by this tool. Quick fix: make your intended sending address (e.g. you@gmail.com) the primary account in your default mail app. Want it bulletproof regardless of default settings, sent automatically with no dragging files at all? See Step 07 — Connect Gmail below — optional, one-time setup, skip it and everything above still works.
01

Signed offer package

Either the ZIP that Offer Pro 1.0 generated, or the individual contract/submission PDFs pulled out of it after your buyer signed. File names must still start Offer_01_, Offer_02_, etc. — that's how this matches each PDF to the right row in the spreadsheet.

Heads up: if an offer was pushed to the buyer from the Generate page (with an Offer Submission Form template uploaded there), its submission form is pulled in automatically here — no re-upload needed. This manual upload below is only a fallback: for older batches from before this existed, or offers that were never pushed through the buyer portal. If a batch still shows "Submission missing" after building the queue, add the original submission forms here (from the ZIP Generate produced, before signing).

02

Proof of funds

One file, attached to every email in the batch.

03

Listing agent / brokerage spreadsheet

The sheet with where each offer needs to go — same layout as your existing file.

04

CC on every email optional

Defaults to Brian (courtsideinvestments@gmail.com) — added as CC on top of whatever's already listed for that agent in the spreadsheet's CC column. Change or clear it if needed; it's saved in this browser so it sticks next time.

05

Sender name optional

Signs off the hello message below.

06

Hello message

Goes in the body of the email itself. Tokens get swapped per offer: {agent_name} {address} {offer_num} {brokerage} {sender_name}

07

Connect Gmail optional — true one-click send

Skip this and everything above still works via mailto + drag-in. Connect it and every ready card below gets a Send Now button that emails straight from you@gmail.com (whichever Gmail account you connect below — not tied to any one specific address) with all 3 attachments already on it — no drag-in, no default-app guessing.

Not connected — Send Now buttons stay off until you connect.
One-time setup, step by step (~10 min, free)

This connects your own Gmail account — every person using this tool does this once, for themselves, with their own Google account. Nobody shares a connection.

  1. Go to Google Cloud Console and sign in with the Gmail account you want offers to send from (e.g. you@gmail.com). If you've never used Cloud Console before, it'll offer a free trial — you don't need to accept any billing, everything here stays on the free tier.
  2. Create a new project (top left, next to the "Google Cloud" logo → dropdown → "New Project"). Any name is fine — it's just a container, nothing shows this to anyone you email.
  3. In the left sidebar, go to APIs & Services → Library, search for Gmail API, and click Enable.
  4. Go to APIs & Services → OAuth consent screen (sometimes labeled "Google Auth Platform"). Choose External as the user type.
  5. Fill in the Branding page: App name (anything, e.g. "My Offer Sender"), your own email as both User support email and under Developer contact information, and under Authorized domains add rawofferpro.netlify.app — then click Save. (App logo, home page, privacy policy, and terms links can all stay blank — none of those are required for this.)
  6. Go to the Audience tab (still under OAuth consent). Confirm the yellow "incomplete" warning is gone — if it's still there, go back to Branding and make sure Save actually went through. Scroll down to Test users → Add users and add the exact Gmail address you're connecting with. This step is easy to miss and is the #1 reason "Connect Gmail" fails with an access-blocked error.
  7. Go to Clients (or "Credentials") in the left sidebar → Create Client → type Web application.
  8. Under Authorized JavaScript origins, add https://rawofferpro.netlify.app exactly — no trailing slash, no path after it. Save.
  9. Copy the Client ID it generates (ends in .apps.googleusercontent.com) and paste it into the field above.
  10. Click Connect Gmail, sign in with the same Gmail address you added as a test user, and approve the "send email on your behalf" permission.

If you hit "Error 401: invalid_client" — the Client ID pasted in doesn't match a real, currently-existing OAuth client. Double check it was copied in full and freshly, straight from the Clients page.

If you hit "Error 403: access_denied" / "has not completed the Google verification process" — you skipped (or haven't saved) the Test users step above. Go back to Audience → Test users and add your address.

Nothing here is stored anywhere by this tool except the Client ID, saved locally in this browser so you don't re-paste it. The access token Google issues lives only in this tab and refreshes itself automatically while you're using the tool.