AI Platform · Marketing & MarTech
The spreadsheet proved the idea. Then it stopped working.
An AI marketing platform for course creators, rebuilt from a Google Sheets prototype that stopped producing anything the day the model behind it was retired.
Binny Chanchal, Founder & Principal Architect
- Client
- scaleforimpact.co
- Engagement
- Productisation of a no-code prototype, then ongoing product engineering
- Domain
- Direct-response marketing for online course creators
- Delivery
- Roughly 455 documented hours across eleven phases, plus a fixed-price interface rebuild
- Stack
- Laravel, Vue, MySQL, Redis, OpenAI, Google Drive API
Before it was a platform, it was a spreadsheet
A form collected inputs about a course creator's product and their audience. Those answers landed in a Google Sheet, where formula-driven language model calls turned each one into finished marketing copy. Pre-headlines. Headlines. Three-email launch sequences. Ads. Video outlines.
Real creators used it, and real creators got usable funnels out of it.
Then the model was retired.
Open the prototype sheet today and almost every generated cell contains the same model deprecation error. Every output column, across every section, failed at the same moment. The inputs survived. The prompt engineering, months of direct-response marketing expertise written into formulas, survived. What did not survive was the product's ability to produce anything at all.
The diagnosis
One hard dependency on one model from one provider, called from a spreadsheet formula. No retry. No fallback. No error handling.
When that dependency was withdrawn there was nothing underneath it. The product did not degrade. It stopped.
That matters for how the rest of this reads. We were not rewriting a working product. We were productising a prototype that had already stopped working, and the distinction shaped every decision that followed.
| Headline | Email 1 | Facebook ad | Video hook |
|---|---|---|---|
| [GPT ERROR] | [GPT ERROR] | [GPT ERROR] | [GPT ERROR] |
| [GPT ERROR] | [GPT ERROR] | [GPT ERROR] | [GPT ERROR] |
| [GPT ERROR] | [GPT ERROR] | [GPT ERROR] | [GPT ERROR] |
| [GPT ERROR] | [GPT ERROR] | [GPT ERROR] | [GPT ERROR] |
| [GPT ERROR] | [GPT ERROR] | [GPT ERROR] | [GPT ERROR] |
What was worth keeping
Two things.
Proven demand. Real users had completed the process and got value from the output. That is harder to establish than a codebase, and the client already had it.
The designed interview. The prototype ran on a five-stage sequence refined by people who understood direct-response marketing. An intro established the product. A customer interview covered the avatar, their problems, what those problems cost them, and their objections to buying. A product interview covered mechanism and differentiation. An author interview was built around the founder's own story. A funnel interview covered the event and its logistics. Every question carried a prompt behind it.
That pairing of question and prompt was the client's intellectual property. Our job was not to invent it, and not to improve it. Our job was to stop it living in a spreadsheet.
Where the work went
The engineering timesheet records roughly 455 documented hours across eleven phases, plus a separate full interface rebuild billed as a fixed amount.
| Workstream | Hours |
|---|---|
| Sales lifecycle, token economics, provider pool | 121 |
| Project setup and the admin question engine | 96 |
| Onboarding rework, localisation, integrations | 70 |
| Prompt chain and copy generation | 34 |
| Dynamic output types, model fallback, categories | 26 |
| Preview, editing, Google Drive export | 24 |
| Output chaining and admin prompt testing | 24 |
| Access control and copy flow | 20 |
| Flow URLs, signup, checkout webhooks | 20 |
| Support and debugging | 13 |
| Trial upgrades and category URLs | 7.5 |
Model integration itself was 20 hours of that total. Calling the model was the smallest line on the sheet.
The billing lifecycle, the token economics and the provider pool together came to 121 hours, six times the model work. Project setup and the question engine came to 96. Onboarding, localisation and integrations came to 70. The part everyone thinks of as the AI took the least time of anything on the list.
A configurable platform, not a wrapper
The interview had to stop being code, the generated copy had to become editable, and the whole thing had to be something a person could buy. Roughly in the order it was built:
Admin question engine.
The interview stored as data. Twenty-seven funnel types were added without an engineering change for each one.
Output chaining.
Section short codes let one output feed another, with sequencing to resolve order.
Prompt testing harness.
Administrators tune prompts without walking the whole interview each time.
Google Drive export.
OAuth, folder creation, per-file progress, every asset delivered to the user's Drive.
Subscription lifecycle.
Cancel, resume, upgrade, grace period and trial, wired to checkout webhooks.
Localisation.
English and Portuguese across the whole product, 40 hours on its own.
Output chaining is the one worth pausing on. Every output section got a short code, existing sections were migrated to the new naming, and the generation workflow was reworked so the output of one step can feed the input of another. That turned a set of independent generations into a dependency graph. It is how a sales page can reference the customer avatar generated three steps earlier.
Alongside those: admin impersonation so support could reproduce a problem from inside a user's account, dynamic output types, editable category and flow URLs, a template library, a staging environment, and a credit system running next to subscriptions. Onboarding friction came out one piece at a time, including the manual approval gate, a post-signup redirect that landed users on an error page, and a verification banner that never cleared.
Model integration was 20 hours of the 455. Everything above is the other 435.
How a funnel is generated
Two loops sit behind a finished funnel. The first runs once per question and produces a confirmed answer. The second runs once per funnel and turns those answers into copy. They are worth separating, because most of what makes the product usable lives in the first one.
One question at a time, and every answer is a draft. Answers are grouped into four segments: Product, Author, Funnel Intro and Funnel. Product alone carries twelve questions. The user answers in their own words, usually a sentence or two, and the platform drafts a fuller version from it.
Behind every question sits a prompt an administrator wrote and attached to it, carrying placeholders for answers given earlier in the interview. The model call is queued rather than made inline, and falls back to another model if generation fails.
What comes back is presented as a suggestion rather than a result, and three things can happen to it. Regenerate tries again, with the button reading Generating while it runs. Edit lets the user rewrite it by hand, and submit stays disabled until something actually changes. Review and confirm accepts it, at which point it is stored against a short code and becomes reusable downstream. Regenerate and edit both loop back to the draft.
Nothing is stored until the user accepts it, and the summary panel fills in as answers are confirmed, so the picture builds while they work.

One funnel is dozens of generations, in order
Confirmed answers become variables. Each is stored against its short code, alongside the copywriting style the user chose.
A flow definition decides what happens to them. It is an administrator-configured list of output sections, each with its own prompt template and its own position in the run, and an output can reference other outputs. That is the dependency graph, expressed as configuration rather than code.
The run assembles each section's prompt from the variables it needs, including outputs produced earlier in the same run. Jobs are queued, executed against the provider pool, retried on a different model if one fails, and token use is recorded per flow.
What comes out is a funnel, not a page. A landing page as pre-headline, headline, sub-headline, problem, what they will learn, author section and bonuses. Emails as announcement, what and when, and last call, each with subject line options. Ads as problem-led and solution-led variants for paid social. Video scripts as hero's journey, results in advance and paradigm shift, each with hook options.
Every block stays editable afterwards. Users revise any section and save it back, then export: Google OAuth, the destination Drive folder created if it does not already exist, and each asset uploaded with its own progress.

Answering the failure twice
The original failure got two answers. The order they came in is the most useful part of the record.
Stage one, three hours. Automatic model fallback: when one model fails to generate, switch to another. It shipped as a routine change request, alongside dynamic output types and categories. Three hours of insurance against precisely the failure that had already killed the product once.
Stage two, forty hours, much later. A token consumption report per flow. Prompt optimisation to reduce tokens per call. A pool of ten or more provider credentials, with each request routed to whichever had the most available capacity. That work was built once real volume justified it, not before.
Teams usually get this backwards. Either they build elaborate multi-provider abstraction before they have a single user and pay for flexibility they never exercise, or they never build it at all and repeat the original failure the next time a provider changes its plans.
Buying the three-hour insurance immediately is what makes the forty-hour version optional until it is not.
Stage one
3 hours
Automatic model fallback
When one model fails to generate, the request switches to another and continues.
Shipped as a routine change request.
Stage two
40 hours
Generation economics
Token reporting per flow, prompt optimisation, and a pool of ten or more providers routed by free capacity.
Built once volume justified it.
Designed for drafts, not answers
One sample answer in the interface designs reads: “As an AI language model, I don't have personal beliefs, thus cannot act as a marketer. However, based on research about objections to purchasing running courses, below are the top 5 objections...”
That is a model refusal preamble leaking into the product, drawn into the designs as ordinary output. Nobody put it there as a joke. It was there because that is what the system produced, and the designs treated it as a normal case to be handled rather than an edge case to be hidden.
It explains the shape of the questionnaire exactly. The design was a two-column workspace. On the left, the active question, with step and question counters and a progress bar. On the right, a live panel titled “Your Product so far”, with tabs for Product, Author, Funnel Intro and Funnel, collapsible question-and-answer rows, and an Edit control on each. The action buttons were Regenerate, Back, and Review and Confirm. Separate states were designed for an empty summary, for a reviewed question, and for regeneration in progress.
That is why the loop described above exists at all. Generated output is a draft rather than an answer, and the refusal preamble sitting in the designs is the evidence for it, better evidence than any assertion we could make.
Onboarding was designed the same way. Three steps, with a progress indicator across them: Account Created, Setup password, Claim your sub domain. The password screen opens by congratulating the user on their purchase and explaining that an account has been created for them automatically, which is checkout-to-account wiring designed as a flow rather than patched in afterwards. The subdomain step warns that once chosen, a subdomain cannot be changed.
What running it looked like
The support phase came to 13 hours, and it is the most honest part of the record.
A trial user whose payment cleared with the checkout provider but never reflected back, leaving the account on trial. A user who hit a credit limit and needed their consumption checked. An onboarding freeze reported by someone whose account turned out to be working normally. Admin search, added because support needed it to do the job.
None of that is model work. All of it is what running an AI product actually looks like.
How it is built
Laravel and PHP, with Sanctum for authentication and Cashier for Stripe subscription billing, alongside checkout-provider webhooks. Vue with Vuex and TypeScript on the front end, styled with Tailwind, over REST.
MySQL for data. Redis and Horizon for queues and background jobs. Amazon S3 for asset storage, and Laravel Mail for transactional email. OpenAI with the client's own prompt engineering. Google OAuth and the Drive API for export. GA4, PostHog and custom telemetry. Containerised with Docker behind Nginx, deployed through GitHub Actions, with a separate staging environment.
Beyond this client
A prototype proves that an idea is good. It does not prove that the idea can run.
The gap between those two things is everything around the model. It is the question engine that lets the interview change without a deploy. It is the dependency graph that lets one output feed another. It is the review loop that assumes the output is a draft. It is billing, grace periods, checkout webhooks, a verification banner that will not clear, and a support inbox. Twenty of roughly 455 hours went into calling the model. The rest went into the conditions that let the call happen reliably, get paid for, and be corrected when it goes wrong.
The rebuild was not about making the output better. It was about making the output keep happening.
From the client
“They helped me build OnlineCourses-AI. I provided them a no-code version of the app built in Google Sheets, they transformed it into an actual product that users can use to take their marketing to their next level. Their work was great, as they were able to take this project to the next level.”
Questions
Common questions
- What happens when the AI model your product depends on is retired?
- Everything that calls it stops at once. In this product every output column across every section failed at the same moment, because there was one hard dependency on one model from one provider, with no retry, no fallback and no error handling.
- How much of an AI product is actually model integration?
- On this build, 20 hours of roughly 455. The sales lifecycle, token economics and provider pool came to 121, project setup and the admin question engine to 96, and onboarding, localisation and integrations to 70.
- Should you build multi-provider AI failover before launch?
- Build the three-hour version immediately and the forty-hour version later. Automatic model fallback took three hours here and shipped as a routine change request. Token consumption reporting, prompt optimisation and a multi-provider capacity pool took forty hours, and were built once real volume justified them.
- Can a Google Sheets prototype be turned into a real product?
- Yes, and the prototype is usually worth more than it looks: it proves demand and it carries the prompt engineering. The work is everything around it, including an engine that makes the interview editable data, persistence, editing, export, billing and a review loop.
- Why let users edit AI-generated output?
- Because it is a draft. One sample answer in this product's designs was a model refusal preamble, drawn in as ordinary output. Regenerate, Edit, and Review and Confirm exist for exactly that reason.
Hours are taken from DuskByte's own engineering timesheet. No performance, revenue, time-saving or user-count figures are claimed for this engagement, because none have been verified.
More like this
Related work
iTwin-AI
AI marketing content and video automation
Read case studyWeld for Google Sheets
ELT/data integration as a Google Workspace add-on
Read case studyGo-Insights
Marketing anomaly-detection SaaS across Ads, Meta, GA4, and Shopify
Have something like this to build?
Book a call and tell us where you're stuck. We'll tell you honestly what it takes.