|
5265 | 5265 | ], |
5266 | 5266 | }; |
5267 | 5267 |
|
| 5268 | + const sponsorOpsSubmissionQueue = [ |
| 5269 | + { |
| 5270 | + name: "Cloudmersive", |
| 5271 | + category: "Document conversion API", |
| 5272 | + contactRouteStatus: "ready", |
| 5273 | + firstAction: "Prepare only", |
| 5274 | + bestContactUrl: "https://portal.cloudmersive.com/partnerships", |
| 5275 | + publicEmail: "", |
| 5276 | + prospectId: "cloudmersive-document-api", |
| 5277 | + dealId: "starter-fit-review", |
| 5278 | + vertical: "pdf-image-qr-saas", |
| 5279 | + note: "Route is ready but requires real email, name, phone, and consent checkbox.", |
| 5280 | + }, |
| 5281 | + { |
| 5282 | + name: "QRCodeChimp", |
| 5283 | + category: "QR code marketing", |
| 5284 | + contactRouteStatus: "review", |
| 5285 | + firstAction: "Open email draft", |
| 5286 | + bestContactUrl: "https://www.qrcodechimp.com/contact", |
| 5287 | + publicEmail: "support@qrcodechimp.com", |
| 5288 | + prospectId: "qrcodechimp-qr-marketing", |
| 5289 | + dealId: "guide-sponsor-pilot", |
| 5290 | + vertical: "local-marketing-qr-sponsors", |
| 5291 | + note: "Public email visible; confirm sponsorship or partnership relevance before sending.", |
| 5292 | + }, |
| 5293 | + { |
| 5294 | + name: "Invoice Ninja", |
| 5295 | + category: "Invoicing software", |
| 5296 | + contactRouteStatus: "review", |
| 5297 | + firstAction: "Open email draft", |
| 5298 | + bestContactUrl: "https://www.invoiceninja.com/contact/", |
| 5299 | + publicEmail: "contact@invoiceninja.com", |
| 5300 | + prospectId: "invoice-ninja-small-business", |
| 5301 | + dealId: "vertical-category-pilot", |
| 5302 | + vertical: "small-business-paperwork-sponsors", |
| 5303 | + note: "Warmest business-paperwork fit; use truthful sender identity and record evidence if sent.", |
| 5304 | + }, |
| 5305 | + { |
| 5306 | + name: "Education.com", |
| 5307 | + category: "Worksheets and learning resources", |
| 5308 | + contactRouteStatus: "review", |
| 5309 | + firstAction: "Open email draft", |
| 5310 | + bestContactUrl: "https://www.education.com/support/contact/", |
| 5311 | + publicEmail: "support@education.com", |
| 5312 | + prospectId: "educationcom-worksheets", |
| 5313 | + dealId: "vertical-category-pilot", |
| 5314 | + vertical: "classroom-printable-sponsors", |
| 5315 | + note: "Public email visible, but the route asks for real sender details; send only from a truthful authorized sender.", |
| 5316 | + }, |
| 5317 | + { |
| 5318 | + name: "Zoho Invoice", |
| 5319 | + category: "Small-business invoicing", |
| 5320 | + contactRouteStatus: "review", |
| 5321 | + firstAction: "Open contact route", |
| 5322 | + bestContactUrl: "https://www.zoho.com/partners", |
| 5323 | + publicEmail: "", |
| 5324 | + prospectId: "zoho-invoice-small-business", |
| 5325 | + dealId: "guide-sponsor-pilot", |
| 5326 | + vertical: "small-business-paperwork-sponsors", |
| 5327 | + note: "Partner route discovered; use public-safe form message only after confirming route fit.", |
| 5328 | + }, |
| 5329 | + ]; |
| 5330 | + |
5268 | 5331 | function sponsorExternalDiscoveryProofLine() { |
5269 | 5332 | const listedCount = sponsorExternalDiscoveryProof.directoryListedCount || sponsorExternalDiscoveryProof.listedDirectories.length; |
5270 | 5333 | const pendingCount = sponsorExternalDiscoveryProof.directoryPendingCount || 0; |
@@ -8274,6 +8337,7 @@ ${paragraphs.join("\n")} |
8274 | 8337 | </div> |
8275 | 8338 | </section> |
8276 | 8339 | </div> |
| 8340 | + ${sponsorOpsSubmissionQueueHtml()} |
8277 | 8341 | </section> |
8278 | 8342 | `; |
8279 | 8343 | } |
@@ -8379,6 +8443,60 @@ ${paragraphs.join("\n")} |
8379 | 8443 | `; |
8380 | 8444 | } |
8381 | 8445 |
|
| 8446 | + function sponsorOpsSubmissionQueueHtml() { |
| 8447 | + return ` |
| 8448 | + <div class="ops-submission-queue"> |
| 8449 | + <h3>Next sponsor submissions</h3> |
| 8450 | + <p class="help">Use only with a truthful sender identity. Mark sent only after a real public form submission or legitimate email send with evidence.</p> |
| 8451 | + <div class="ops-action-list"> |
| 8452 | + ${sponsorOpsSubmissionQueue.map(sponsorOpsSubmissionCard).join("")} |
| 8453 | + </div> |
| 8454 | + </div>`; |
| 8455 | + } |
| 8456 | + |
| 8457 | + function sponsorOpsSubmissionCard(row) { |
| 8458 | + const prospect = sponsorProspects.find((item) => item.id === row.prospectId) || { |
| 8459 | + id: row.prospectId, |
| 8460 | + name: row.name, |
| 8461 | + category: row.category, |
| 8462 | + website: "", |
| 8463 | + contactUrl: row.bestContactUrl, |
| 8464 | + fitReason: row.note, |
| 8465 | + vertical: row.vertical, |
| 8466 | + dealId: row.dealId, |
| 8467 | + }; |
| 8468 | + const vertical = sponsorVerticals.find((item) => item.slug === row.vertical) || sponsorVerticals[0]; |
| 8469 | + const deal = sponsorDeals.find((item) => item.id === row.dealId) || sponsorDeals[1] || sponsorDeals[0]; |
| 8470 | + const proposalUrl = sponsorProspectProposalUrl(prospect, deal, vertical); |
| 8471 | + const publicReplyUrl = sponsorPublicReplyUrl(prospect, deal, vertical, proposalUrl); |
| 8472 | + const pitch = sponsorProspectPitch(prospect, deal, vertical, proposalUrl); |
| 8473 | + const mailtoUrl = row.publicEmail ? sponsorMailtoDraft(row.publicEmail, `${deal.title} for ${vertical.title}`, pitch) : ""; |
| 8474 | + return ` |
| 8475 | + <article class="ops-action-card sponsor-submission-card"> |
| 8476 | + <div> |
| 8477 | + <p class="eyebrow">${escapeHtml(row.contactRouteStatus)} / ${escapeHtml(row.firstAction)}</p> |
| 8478 | + <h4>${escapeHtml(row.name)}</h4> |
| 8479 | + <p><strong>${escapeHtml(deal.title)}:</strong> ${escapeHtml(deal.price)} · ${escapeHtml(row.category)}</p> |
| 8480 | + <p class="help">${escapeHtml(row.note)}</p> |
| 8481 | + </div> |
| 8482 | + <div class="ops-action-buttons"> |
| 8483 | + <a class="button secondary" href="${escapeHtml(row.bestContactUrl)}" target="_blank" rel="noreferrer">Open route</a> |
| 8484 | + ${mailtoUrl ? `<a class="button" href="${escapeHtml(mailtoUrl)}">Open email draft</a>` : ""} |
| 8485 | + <a class="button secondary" href="${escapeHtml(proposalUrl)}" target="_blank" rel="noreferrer">Short proposal</a> |
| 8486 | + <a class="button ghost" href="${escapeHtml(sponsorVerticalInvoiceReviewUrl(vertical, row.prospectId))}" target="_blank" rel="noreferrer">Invoice URL</a> |
| 8487 | + <a class="button ghost" href="${escapeHtml(publicReplyUrl)}" target="_blank" rel="noreferrer">Public reply</a> |
| 8488 | + <button class="button ghost" type="button" data-copy-text="${escapeHtml(pitch)}">Copy message</button> |
| 8489 | + </div> |
| 8490 | + </article>`; |
| 8491 | + } |
| 8492 | + |
| 8493 | + function sponsorMailtoDraft(email, subject, body) { |
| 8494 | + const params = new URLSearchParams(); |
| 8495 | + params.set("subject", subject || "PrintableTools Lab sponsor pilot"); |
| 8496 | + params.set("body", body || ""); |
| 8497 | + return `mailto:${email}?${params.toString()}`; |
| 8498 | + } |
| 8499 | + |
8382 | 8500 | function sponsorProspectFromParams(params) { |
8383 | 8501 | const id = String(params.get("prospect") || params.get("utm_content") || "").trim(); |
8384 | 8502 | const found = sponsorProspects.find((item) => item.id === id); |
|
0 commit comments